php面向对象 类调用方法_PHP-php面向对象的链式调用方式的实现?

思路基本一致,解决方法就是执行完之后返回一个对象。实现代码示例:

error_reporting(E_ALL | E_STRICT);

Abstract Class Base_OOP_VAR{

/**

* 追溯数据,用来进行调试

* @var array

*/

private $_trace_data = array();

/**

* 保存可用的方法列表

* @var array

*/

protected $_methods = array(

);

/**

* 数据本身

* @var null

*/

protected $data;

/**

* 初始化变量

* @param var

* @return void

*/

public function __construct($data){

$this->data = $data;

$this->_trace_data['__construct'] = $data;

return $this->data;

}

/**

* 魔术方法,当试图对对象进行打印如 echo 或print的时候,调用这个方法

*

* 比如:

* $a = new stdClass;

* echo $a;

* 等价于 echo $a->__toString();

*

* @return $data

*/

public function __toString(){

if(is_int($this->data) || is_float($this->data))

$this->data = (string)$this->data;

return $this->data;

}

/**

* 魔术方法,当试图调用一个不存在的方法时,这个函数会接管这个请求

*

* 比如

* $a= new stdClass;

* $a->output();

* 等价于

* $a->__call("output");

*

* @return object

*/

public function __call($name,$args){

$this->vaild_func($name);

if(!$args) $args = $this->data;

$this->data = call_user_func($name,$args);

$this->_trace_data[$name] = $this->data;

return $this;

}

/**

* 检查方法是否是有效的

* @params string $name

* @return void

*/

private function vaild_func($name){

if(!in_array($name,$this->_methods)){

throw new Exception("invaild method");

}

}

/**

* 对数据进行追溯

* 比如

* $a = new String(" Hello World");

* $a->trim()->strlen();

* 在调用trim的时候,实际上把前后的空格给去掉了,所以数据是

* Hello World

* 在调用strlen的时候

* 得到了一个字符串长度的值

* 追溯数据方便检查在哪个环节数据出现了问题

*

* @return string

*/

public function trace(){

echo "

";

var_dump($this->_trace_data);

echo "

";

}

}

/**

* ex. 怎么来使用这个抽象类

*

* 声明一个字符串对象

* class String extends Base_OOP_VAR{

* //添加可用的方法

* protected $_methods = array(

* 'trim',

* 'strlen',

* 'gettype'

* );

*

* }

* //使用这个对象

* $a = new String(" Hello world");

* echo $a->trim()->strlen()->gettype();

* $a->trace();

* //调试的数据类似这样

* array(4) {

* //初始化时的数据

* ["__construct"]=> string(12) " Hello world"

* //去除前后空格的数据

* ["trim"]=> string(11) "Hello world"

* //代表字符串长度的数据

* ["strlen"]=> int(11)

* //代表字符串类型的数据

* ["gettype"]=> string(7) "integer"

* }

*

*

*

*

**/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值