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。用来反射出类自身。里面包含了一系列的操作,可以得到类的所有可访问信息,甚至可以实例化新对象。
jeyfang