PHP魔术方法的使用示例
php  /  管理员 发布于 7年前   166
① __get/__set:将对象的属性进行接管 当访问一个不存在的对象属性时: index.php $obj = new \Common\Object(); //在php中访问一个不存在的对象属性时 会抛出一个错误:Notice: Undefined property: Common\Object::$title in D:\practise\php\design\psr0\index.php on line 9 当在Common/Object.php 中添加 __set 和 __get 方法后 Object.php class Object{ 再执行 index.php,不会再报错。 再次修改 Common/Object.php class Object{ $obj = new \Common\Object(); $obj->title = 'hello'; 执行 index.php,页面输出: ② __call/__callStatic:控制 PHP 对象方法的调用(__callStatic 用来控制类的静态方法) 当执行一个不存在的php方法时 index.php: $obj = new \Common\Object(); //当执行一个不存在的php方法时 执行 index.php 会报一个致命错误:Fatal error: Call to undefined method Common\Object::test() in D:\practise\php\design\psr0\index.php on line 9 如果在 Common/Object 中定义一个__call 方法,则会在方法不存在时自动回调: class Object{ index.php $obj = new \Common\Object(); //当执行一个不存在的php方法时 页面输出: 当调用一个不存在的静态方法时 Common/Object.php class Object{ 注意:__callStatic 方法也要声明成静态方法 index.php //执行一个不存在的静态方法 执行 index.php ,页面输出: ③ __toString:将一个 PHP 对象转换成一个字符串 index.php $obj = new \Common\Object(); echo $obj; 此时会报错: Catchable fatal error: Object of class Common\Object could not be converted to string in D:\practise\php\design\psr0\index.php on line 8 在 Object.php 中添加 __toString 方法 class Object{ ④ __invoke:将一个 PHP 对象当成一个函数来执行时,会回调此魔术方法 index.php $obj = new \Common\Object(); echo $obj("test"); class Object{ 页面输出: 122 在 123 在 原梓番博客 在 博主 在 1111 在
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号
define('BASEDIR',__DIR__); //定义根目录常量
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\\Common\\Loader::autoload');
echo $obj->title;
namespace Common;
function __set($key,$value){
}
function __get($key){
}
}
namespace Common;
protected $array = array();
function __set($key,$value){
var_dump(__METHOD__);
$this->array[$key] = $value;
}
function __get($key){
var_dump(__METHOD__);
return $this->array[$key];
}
}
index.php
复制代码 代码如下:
define('BASEDIR',__DIR__); //定义根目录常量
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\\Common\\Loader::autoload');
echo $obj->title;
string 'Common\Object::__set' (length=20)
string 'Common\Object::__get' (length=20)
hello
define('BASEDIR',__DIR__); //定义根目录常量
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\\Common\\Loader::autoload');
$obj->test('hello',123);
namespace Common;
function __call($func, $param){ //$func 方法名 $param 参数
var_dump($func, $param);
return "magic function\n"; //返回一个字符串作为返回值
}
}
define('BASEDIR',__DIR__); //定义根目录常量
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\\Common\\Loader::autoload');
echo $obj->test('hello',123);
string 'test' (length=4)
array
0 => string 'hello' (length=5)
1 => int 123
magic function
namespace Common;
static function __callStatic($name, $arguments) {
var_dump($name, $arguments);
return "magic function\n"; //返回一个字符串作为返回值
}
}
define('BASEDIR',__DIR__); //定义根目录常量
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\\Common\\Loader::autoload');
echo Common\Object::test("hello",1234);
string 'test' (length=4)
array
0 => string 'hello' (length=5)
1 => int 1234
magic function
define('BASEDIR',__DIR__); //定义根目录常量
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\\Common\\Loader::autoload');
namespace Common;
function __toString() {
return __CLASS__;
}
}
define('BASEDIR',__DIR__); //定义根目录常量
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\\Common\\Loader::autoload');
Object.php
复制代码 代码如下:
namespace Common;
function __invoke($param) {
var_dump($param);
return 'invoke';
}
}
string 'test' (length=4)
invoke您可能感兴趣的文章:
上一条:
PHP实现链式操作的核心思想
下一条:
8个PHP数组面试题