1

我正在使用溢出 __set 和 __get 方法,我希望能够模拟私有/公共类变量。

我确信这个问题的答案已经存在,但我一直在挖掘并且找不到任何东西。让我试着展示一个例子,说明我正在尝试做的事情。

<?php
class Person
{
    public function test()
    {
        return $this->whereami();
    }

    public function whereami()
    {
         if (method_called_inside_class()) {
             return 'private';
         } else {
             return 'public';
         }
    }
}

$person = new Person();
$person->test(); // 'private'
$person->whereami(); // 'public'

我想要的是在对象内调用与从外部调用时方法的不同功能。我知道我可以添加另一个参数来表示行为的变化,或者创建另一个函数。但是,如果我在这里尝试做的事情以某种方式是可能的,而不是其他两个选项,那就太棒了!

4

1 回答 1

0

如果我理解正确,您想使用未在代码中明确定义但可以使用的对象变量。对于其中一些人来说,神奇的 getter 和 setter 应该返回变量,而对于另一些人来说,他们不应该。

假设这一点,您可以通过执行以下操作来部分解决问题。在类中,您必须直接使用$this->data['name'];. 我知道这不是您正在寻找的 100%,但我认为您实际上无法区分来自课堂内和课堂外的呼叫。您使用的功能甚至不存在。

<?php

class MagicGetterSetter {
    // contains the variables
    private $data = array();

    private $publicVariables = array('test', 'foo', 'hierarchy');

    public function __get($name) {
        if (isset($this->data[$name])) {
            if (in_array($name, $this->publicVariables)) {
                return $this->data[$name];
            }
        }

        return null;
    }

    public function __set($name, $value) {
        if (in_array($name, $this->publicVariables)) {
            $this->data[$name] = $value;
        }
    }

    public function __isset($name) {
        if (in_array($name, $this->publicVariables)) {
            return isset($this->data[$name]);
        }

        return false;
    }
}
于 2013-07-25T13:02:32.453 回答