类的自动加载
关键字:__autoload;
实际用法
function __autoload($name){
require "./lib/".$name.".class.php";
}
$db = new A();
注册多个
spl_autoload_regist(“函数名1”);
spl_autoload_regist(“函数名2”);
function 函数名1 ($calss){
require "./lib/".$name.".class.php";
}
function 函数名2 ($calss){
require "./class/".$name.".class.php";
}
克隆
关键字:clone
class B{
public $b2 = 2;
}
class A{
public $a1 = 1;
public $b1; //意图用于存储B的对象
function __construct(){
$this->b1 = new B();
//即new的时候b1中存储的是对象.
}
function __clone(){
//为了实现深克隆
$this->b1 = clone $this->b1;
}
}
$o1 = new A();
$o2 = clone $o1;
$o1->a1 = 10;
$o1->b1->b2 = 20;
var_dump($o1);
var_dump($o2);
浅克隆时:修改了o1中的b1数据,发现o2种的b1数据也跟着改变了(没有__clone())
深克隆时:人为去复制浅克隆复制不了数据(有__clone())
对象的遍历
$db->new a();
foreach($db as $k=>$v){}
注:protected和private属性都不能遍历出来
若需要都遍历出来,应该吧foreach写在类的方法里里面,输出方法的结果
PHP内置标准
$o1=new stdclass();
可以直接对$o1对象进行操作
$o1=a->1;
将数据类型转化为对象
数组转换为对象:数组的键名当作属性名,值为对应值
$o1=(object)$arr
只适用于纯字符下标数组
null转换后为空对象
其他标量数据转换为对象:属性名为固定的“scalar”,值为该变量的值
类型约束
function f1(类名 $p1){....}:要求该参数只能使用该类的对象;
function f1(接口名 $p1){....}:要求该参数只能使用实现该接口的对象;
function f1(array $p1){....}:要求该参数只能使用数组;
function f1(callable $p1){....}:要求该参数只能是一个函数或方法,此时称之为回调函数(方法)
常用魔术参数
__CLASS__,:获取其所在的类的类名。
__METHOD__:获取其所在的方法的方法名。
__sleep(), 和 __wakeup()(序列化和反序列化)
__tostring()方法(可以返回“合适”的字符串,也可以认为就是对象转换为字符串的结果)
class A{
public $o1=1;
public $o2=2;
function __tostring(){
return $this->o1.",".$this->o2
}
}
返回结果为 1,2
__invoke()方法
对象当作一个“方法”(函数)的时候,会自动调用该魔术方法