从PHP对象内部或外部运行

时间:2013-07-25 04:19:25

标签: php oop scope

我正在使用overflow __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'

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

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望使用未在代码中明确定义但可以使用的对象变量。而对于他们中的一些人来说,魔法的吸气剂和设定者应该返回变量,而对于其他人则不应该。

假设这样,您可以通过执行以下操作来部分解决问题。在课堂内,您必须使用$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;
    }
}