标签 php 下的文章

花了两个晚上的时间,写了一个小插件,用于在文章中引用豆瓣图书的时候可以嵌入豆瓣图书的信息,实现原理也很简单,无非就是正则匹配然后替换返回。
下面是实际的使用效果:
在博文中输入了[book:1441789]会自动生成如下的图书信息卡片。
[book:1441789]

使用方法也非常的简单,上传到插件目录激活后即可,在撰写文章或者页面时输入[book:图书编号]即可。
为了防止调用过于频繁被豆瓣屏蔽,首次调用豆瓣图书API后,获取到的json信息和图书封面文件都会保存在本地。

usr/plugins/BookInfo/resources/bookinfo 这里存放了以图书编号命名的json数据;
usr/plugins/BookInfo/resources/bookcover 这里存放了以图书编号命名的封面图片;

删除上述文件夹下的内容并不影响使用,插件会重新获取对应的图书信息。

下载地址:

Github

本站

<?php

// 字符串的使用细节


/**
 *  一 单引号的使用
 *  效率高,不对变量进行解析
 */


$num =10;
$str = 'hello beijing $num';
echo '<pre>';
var_dump($str);
echo $str.'<hr />';


/**
 * 二 双引号的使用
 * 双引号会对$解析,效率低
 */



$num =10;
$str = "hello beijing $num";
echo '<pre>';
var_dump($str);
echo $str.'<hr />';

// 在双引号中解析数组元素等复杂变量时,应当加上{}

$arr = array(
    'one'=>'cat',
    'two'=>'mouse',
    'three'=>'pig'
);

echo "数组键直为one对应的值为{$arr['one']}<hr />";


/**
 * heredoc的使用
 * 定界符可以自定义,一般大写,以 <<<定界符 换行后添加内容,定界符需一致
 * heredoc 用于输出大段的HTML代码,会解析变量
 */

 $str = '强大的';
 $div = <<<HTMLCON

 <div>
    <h2>Wow! {$str}heredoc</h2>
    <ul>
        <li>first</li>
        <li>second</li>
        <li>third</li>
    </ul>
 </div>
HTMLCON;


echo $div.'<hr />';


/**
 * nowdoc的使用
 * heredoc的开始定界符加上单引号,区别是nowdoc不解析变量
 * 
 */


$div = <<<'HTMLCON'

<div>
   <h2>Wow! {$str}heredoc</h2>
   <ul>
       <li>first</li>
       <li>second</li>
       <li>third</li>
   </ul>
</div>
HTMLCON;

echo $div;

概念:
抽象方法:类中有一个方法,而方法并没有方法体,这种方法叫作抽象方法
抽象类:只要包含抽象方法的类一定就是抽象类,而抽象类中不一定包含抽象方法,抽象类中可以同时包含普通方法和抽象方法。



- 阅读剩余部分 -

将对象或者数组串行化后,可以写入数据库中。
这是一个串行后的数组:

string(172) "a:5:{s:4:"name";s:25:"201712261823302368352.gif";s:4:"path";s:35:"/usr/uploads/2018/01/3072538610.gif";s:4:"size";i:526047;s:4:"type";s:3:"gif";s:4:"mime";s:9:"image/png";}"

转换成数组

将数组串行化成文本:

$string = serialize($array);

将串行文本转换成数组

$array = unserialize($string);

/*
# 单例设计模式
*/


class multiObj{
    public function __construct(){
        echo " DataBase Linked <br />";
    }
    public function select(){
        echo "select *";
    }
}

$obj1 = new multiObj(); # 生成 Obj#1
$obj2 = new multiObj(); # 生成 Obj#2
$obj3 = new multiObj(); # 生成 Obj#3
var_dump($obj1);
var_dump($obj2);
var_dump($obj3);



/* 单例设计模式,可以防止类被多次的实例化 */

class singleObj{
        static $obj = null; # 用来标记实例,默认不存在
        private function __construct(){
            echo "<br />DataBase Linked<br/>";
        }
        static function getObj(){
            if(is_null(self::$obj)){  # 判断实例是否存在
               self::$obj = new self(); 
               #不存在则实例化类生成实例 , singleObj()换成self()
            }
             return self::$obj;  # 存在实例,直接返回实例
        }
        public function select(){
            echo "select *";
        }
}

$sobj1 = singleObj::getObj(); # 不存在实例 生成Obj #4
$sobj2 = singleObj::getObj(); # 存在实例 返回Obj #4
$sobj3 = singleObj::getObj(); # 存在实例 返回Obj #4
var_dump($sobj1);
var_dump($sobj2);
var_dump($sobj3);

为了防止对象从外部克隆时生成重复对象,还应当增加一个private function __clone(){}方法。
基本上,要实现单例模式,需要禁用构造方法和克隆方法,禁用的方法也很简单,只要加上private 修饰即可。

final 关键字

出于安全考虑,被final修饰的类无法继承,被final修饰的方法无法被重写,关键字final只能用来修饰类和方法。

class parentClass{

    final public function show(){
        echo "This is a class named parentClass";
    }

}

class childClass extends parentClass{

    public function show(){
        echo "This is a class named childClass";
    }

}

childClass::show();

/* 
#
# final 关键字只能用来修饰类和方法,final 修饰的类不能被继承,
# final 修饰的方法不能被重写
#
*/

以上代码输出:

Fatal error: Cannot override final method parentClass::show() in *_class.php on line 17

static 关键字

static 可以用来修饰成员属性和成员方法,以声明该属性和方法为静态,静态属性和静态方法不需要实例化即可访问,访问方法为类名::$静态属性|静态方法()

在类的内部引用静态属性和静态方法时,不可使用$this->$属性|方法(),而应该使用self::$属性|方法()。换句话说,如果类中的成员属性和成员方法使用了static修饰的话,如果需要在类的其他方法中引用它们,就必须使用self::$属性|方法()来调用。

const 关键字

如果需要在类的内部定义常量,则需要使用const关键字,其基本语法是 const CONSTANT = 'CONSTANT VALUE';。在类的内部访问常量则需要定义专有方法,在类的外部访问常量和访问及静态属性类似,只要使用类名::CONSTANT即可。

instanceof 关键字

这个关键字用来判断当前对象是否是某个类实例化而来,其基本语法是 $obj instanceof Class,会返回一个布尔结果。

__set() 方法

class person{

    public $name;
    private $weight;
    protected $age;

    public function __construct($name,$weight,$age){
        $this->name = $name;
        $this->weight = $weight;
        $this->age = $age;
    }

    /*
    public function set($name,$value){ // 此处的$name 和属性$name 不同注意理解区分
        $this->$name = $value; // 注意$this->$name 中的$name的意义
        return $this->$name;
    }
    */

    # 自动调用 无需手工书写如$p->set($varName,$varVaule) 
    public function __set($name,$vaule){ 
         
        $this->$name = $vaule;
    }
    

    public function property(){
        echo "The weight for {$this->name}  is {$this->weight} kg , his age is {$this->age} years old " ;
    }

}

$bushou = new person('bushou',87,28);

/* 
# 手工调用set()方法
$bushou->set('weight',60);
$bushou->set('age',18);
var_dump($bushou); // 对象赋值之后,并不能使用$this->age或者$this->weight直接取到数据
*/

# 自动触发__set()方法
$bushou->weight = 60;
$bushou->age = 19;
var_dump($bushou);

以上代码运行后会输出:

object(person)#1 (3) {
["name"]=> string(6) "bushou"
["weight":"person":private]=> int(60)
["age":protected]=> int(19)
}

之前自己摸索着学习过一段时间的PHP编程,也尝试开发出了基于过程的单用户博客系统Slience. 由于想涉足大中型项目的实战开发,之前学习的那点皮毛根本是杯水车薪,于是趁着工作任务不重,打算系统的学习一下PHP开发。太过基础的内容并没有记在这里,因为都很容易掌握,关于面向对象的解释和理论也并没有放在这里,这里可能要花几篇的篇幅来记录一下对OOP开发过程中会常用到的一些方法和函数的理解。

- 阅读剩余部分 -