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