您的位置:首页 > 编程语言 > PHP开发

PHP面向对象编程(四)

2016-12-26 11:52 204 查看

四.面向对象中的魔术方法(php中 特有的 )

1._ _tostring()

当对象被当做String使用时,这个方法会被自动调用.

echo $obj

2._ _invoke()

当对象被当成方法调用时,这个方法会被自动调用

$obj(4)

class MagicTest{
//__tostring会在把对象转换为string的时候自动调用
public function __tostring(){
return 'This is the Class MagicTest.';
}
//__invoke会把对象当做一个方法调用的时候自动调用
public function __invoke($x){
echo '__invoke called with parameter '.$x;
}
}

$obj = new MagicTest();

echo $obj;

$obj(5);


3._ _call()

当对象访问不存在的方法名称时,__call()方法会被自动调用

4._ _callStatic()

当对象访问不存在的静态方法名称时,__callStatic()方法会被自动调用

这两个方法在php里面也被称为方法的重载(overloading)

通过这两个方法,同一个方法的名称的调用可以对应不同的方法实现

class MagicTest{
//方法的重载
//这个方法的参数第一个就是调用方法的名称,
//第二个参数是方法调用的参数组成的数组.
public function __call($name,$arguments){
echo 'Calling '.$name.' with parameters:'.implode(', ',$arguments);
}
//静态方法的重载,注意这个方法需要设定为static
public static function __callStatic(){
echo 'Static calling '.$name.' with parameters:'.implode(', ',$arguments);
}
}

$obj = new MagicTest();
$obj->runTest('para1','para2');
MagicTest::runTest('para1','para2');


5._ _get()

读取不可访问属性的值时,__get()会被调用

6._ _set()

在给不可访问属性赋值时,__set()会被调用

7._ _isset()

当对不可访问属性调用isset()或empty()时,__isset()会被调用

8._ _unset()

当对不可访问属性调用unset()时,__unset()会被调用

所谓不可访问属性,实际上就是在调用某个属性是发现这个属性没有被定义,这时候不同的操作会出发不同的魔术方法

这几个方法也被称为属性重载的魔术方法

class MagicTest{
//属性的重载
public function __get($name){
return 'Getting the property '.$name
}
public function __set($name,$value){
echo 'Setting the property '.$name.' to value '.$value;
}
public function __isset($name){
echo '__isset invoked';
return true;
}
public function __unset($name){
echo 'unsetting property '.$name;
}
}

$obj = new MagicTest();
echo $obj->className;
$obj->className = 'MagicClassx';
echo '$obj->className is Set?'.isset($obj->className);
echo '$obj->className is empty?'.empty($obj->className);
unset($obj->className);


9._ _clone()

当复制对象时,__clone()方法自动调用

class NbaPlayer{
public $name;
function __clone(){
$this->name = 'TBD';
}
}
$james = new NbaPlayer();
$james->name = 'james';
echo $james->name;
$james2=clone $james;
echo 'Before set up: james2 :'.$james2->name;
$james2->name='$james2';
echo 'james :'.$james->name;
echo 'james2 :'.$james2->name;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息