在PHP中创建和使用魔术方法

时间:2016-01-08 14:14:11

标签: php magic-methods

我正在努力掌握PHP的魔术方法,为此我创建了一个看起来如下的测试类:

<?php
class overload
{
    protected $lastCalledParam;

    public $param;

    public function __construct() 
    {
        return $this->switchConstruct(func_get_args());
    }

    protected function switchConstruct(array $args)
    {
        switch (count($args))
        {
            case 0:
                return print "0 params<br />";
            case 1:
                return call_user_func_array(array($this, 'constr1'), $args);
            case 2:
                return call_user_func_array(array($this, 'constr2'), $args);
        }
        die("Invalid number of args");  
    }

    protected function constr1($a) 
    {
        print "constr1 called<br />";
    }

    protected function constr2($a, $b) 
    {
        print "constr2 called<br />";
    }

    public function __get($name)
    {
        $this->lastCalledParam = $name;
        return $this->{$name};
    }

    public function __set($name, $value)
    {
        $this->lastCalledParam = $name;
        $this->{$name} = $value;
    }

    protected function lastCalled()
    {
        if (func_num_args() == 1)
        {
            $args = func_get_args();
            $this->lastCalledParam = $args[0];
        }
        return $this->lastCalledParam;
    }

    public function __toString()
    {
        return $this->lastCalledParam == null ? "No data found" : $this->lastCalledParam;
    }
}

并且这样称呼:

<?php

require_once 'clib/overload.php';

$c = new overload();
print $c->__toString();
print "<br />";
$c->param = "Hello";
print $c->__toString();
?>

我期待的行为是,在第一次__toString()来电时,会有:

  

0 params
  没有找到数据
  你好

但我得到的是:

  

0 params
  没有找到数据
  没有找到数据

我已经遇到了一个主要的问题,并且无法理解为什么它没有做设置lastCalledParam属性的工作!

我收到了总共0个错误和0个警告,并显示完整错误和警告报告,所以我不明白什么是未被调用,在哪里/为什么。

1 个答案:

答案 0 :(得分:6)

只有在无法正常访问参数时才会调用

cellForRowAtIndexPath:(NSIndexPath *)indexPath。您的UITableView至少需要__set才能调用public $param

  将数据写入 无法访问的 属性时,会运行

protected

     

http://php.net/manual/en/language.oop5.overloading.php#object.set(强调我的)