php每年第一周,php--第一周

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

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

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

1 namespace statictest;

classPerson{2 public static functionownClass(){3 echo __CLASS__;4 }5 public functiontest(){6 //延迟静态绑定

7 static::ownClass();8 }9 }10

11 classson{12 public static functionownClass(){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 classdbo{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。

现有类PersonclassPerson{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 = newPerson();

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

原文:http://www.cnblogs.com/jeyfang/p/6416346.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值