php--第一周

  上周一周的时间主要集中在php深入对象这一块的知识上。基本的属性,访问,继承,覆盖,构造函数,命名空间,匿名函数,反射等等。

  记几个比较印象深刻的例子。

  第一个,延迟静态绑定。该意思是原本在定义阶段固定下来的表达式或变量,改在执行阶段才决定,根据当前环境输出。

 1 namespace statictest;
  class Person{ 2 public static function ownClass(){ 3 echo __CLASS__; 4 } 5 public function test(){ 6 //延迟静态绑定 7 static::ownClass(); 8 } 9 } 10 11 class son{ 12 public static function ownClass(){ 13 echo __CLASS__; 14 } 15 }

实例化son调用test则输出son,实例化Person调用test则输出Person
若改为self::ownClass(),则无论实例化哪个则输出Person

  上述例子,如果不使用static::ownClass(),而使用self::ownClass(),则会始终调用的是Person的class,因为在定义使用的是self,而test方法存在其Person中。而利用static则在代码执行阶段根据环境输出。

  第二个,call_user_func的使用。call_user_func经常用来调用自己定义的函数,使用场景很多。这次主要是在用法上。

  举下面几个例子:

call_user_func('statictest\Person::ownClass');
call_user_func(Person::ownClass);
call_user_func([new Person(),'test']);
call_user_func(['statictest\Person','test'])
总结起来就是第一个参数要是方法,所以无论是用字符串还是数组的方式,要把被调用的方法表示出来。当然第一个参数如果是用数组方法表示出来的,那么数组里的第一个参数就是对象或者类名称,
第二个就是方法名。

  第三个,利用对象的方式连接数据库--PDO。

 1 class dbo{
 2     private static $database;
 3     private $connection;
 4     function __construct($connect){
 5         if(!is_object(self::$database[$connect])){
 6             list($host,$dbname,$username,$password) = explode(',',$connect);
 7             $dsn = "mysql:host={$host};dbname={$dbname}";
 8             try{
 9                 $this->connection = new PDO($dsn,$username,$password);
10                 self::$database[$connect] = $this->connection;
11                 self::$database[$connect]->query('set names utf8');
12                 self::$database[$connect]->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT);
13             }
14             catch(Exception $error){
15                 $error = iconv('gbk','utf-8',$error->getMessage());
16                 die($error);
17             }
18         }
19         $this->connection = self::$database[$connect];
20     }
21     function getAll($sql){
22         $args = func_get_args();
23         array_shift($args);
24         $statement = $this->connection->prepare($sql);
25         $statement->execute($args);
26         return $statement->fetchAll(PDO::FETCH_ASSOC);
27     }
28 }
29 $mysqlDb = new dbo("localhost,library,jey,123654");
30 $result = $mysqlDb->getAll('select * from categories where id > ?',3);

   第四个--克隆,clone。

  有时我们赋值对象的时候,经常是引用赋值,其中一个复制的对属性有改动后所有的对象将会变化,这与我们原本的意愿相违背。我们只是要一个复制对象,与原来的没有关系,这时我们就用到clone。

   

现有类Person
class Person{
    private $id;
    $name;
    $age
    function __constructor($name,$age){
        $this->name = $name;
        $this->age = $age;
    }
    function setId($id){
        $this->id = $id;
    }
    function __tostring(){
        echo 'id->'.$this->id.';$name->'.$this->name.';$this->age'.$this->age;
    }
}

$father = new Person();
$father->setId(0897);
$uncle = clone $father;
这里我们直接用clone迅速得到一个快速的uncle,但是又有问题了,我们的id应该时唯一,不能直接复制。于是我们可以设置clone时的操作。并且如果Person里有一个对象属性balance,
我们
如果不对它作限制的话,同样也将会是引用复制。于是我们对里面的对象属性也作clone操作。

class Person{
../
function __clone(){
$this->id = 0000;
$this->balance = clone $this->balance;
}
}

   第五个,反射,ReflectionClass。用来反射出类自身。里面包含了一系列的操作,可以得到类的所有可访问信息,甚至可以实例化新对象。

posted @ 2017-02-26 16:13  jeyfang  阅读(172)  评论(0编辑  收藏  举报