Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 实例化对象上的魔术方法_set()_Php_Design Patterns_Object_Reflection - Fatal编程技术网

Php 实例化对象上的魔术方法_set()

Php 实例化对象上的魔术方法_set(),php,design-patterns,object,reflection,Php,Design Patterns,Object,Reflection,好的,我有一个问题,对不起,如果我不能解释清楚,但代码说明了它自己 我有一个类,它根据给定的类名生成对象; 假设我们说这个类是模块: public function name($name) { $this->includeModule($name); try { $module = new ReflectionClass($name); $instance = $module->isInstantiable() ? $module-

好的,我有一个问题,对不起,如果我不能解释清楚,但代码说明了它自己

我有一个类,它根据给定的类名生成对象; 假设我们说这个类是模块:

public function name($name)
{

   $this->includeModule($name);

   try
   {
       $module    = new ReflectionClass($name);
     $instance = $module->isInstantiable() ? $module->newInstance() : "Err";

      $this->addDelegate($instance);
   }

   catch(Exception $e)
   {
      Modules::Name("Logger")->log($e->getMessage());
   }
   return $this;
 }
AddDelegate方法:

protected function addDelegate($delegate)
{
    $this->aDelegates[] = $delegate;
}
调用方法

public function __call($methodName, $parameters)
{

   $delegated = false;

   foreach ($this->aDelegates as $delegate)
   {
          if(class_exists(get_class($delegate)))
          {

         if(method_exists($delegate,$methodName))
         {
        $method     = new ReflectionMethod(get_class($delegate), $methodName);

        $function   = array($delegate, $methodName);

       return  call_user_func_array($function, $parameters);
          }
     }

   }
获取方法

public function __get($property)
    {
        foreach($this->aDelegates as $delegate)
        {
            if ($delegate->$property !== false)
            {
                return $delegate->$property;
            }

        }


    }
除了函数集之外,所有这些都可以正常工作

public function __set($property,$value)
    {

        //print_r($this->aDelegates);

        foreach($this->aDelegates as $k=>$delegate)
        {
            //print_r($k);
            //print_r($delegate);
            if (property_exists($delegate, $property))
            {
                $delegate->$property = $value;
            }

        }
        //$this->addDelegate($delegate);
        print_r($this->aDelegates);


    }

class tester
{
  public function __set($name,$value)
    {
        self::$module->name(self::$name)->__set($name,$value);
    }
}


Module::test("logger")->log("test"); //  this logs,  it works
echo Module::test("logger")->path; //prints /home/bla/test/ this is also correct
但是我不能像这样设置类日志的任何值

Module::tester("logger")->path ="/home/bla/test/log/";
类记录器的路径属性是公共的,因此它不是受保护或私有属性访问的问题

我如何解决这个问题?我希望我能把我的问题解释清楚

编辑: 简单的演示

Modules::Name("XML_Helper")->xmlVersion ="Hello"; // default is 333
$a =  Modules::Name("XML_Helper")->xmlVersion; // now $a should contain "Hello" 
echo $a; // prints 333
我需要的是

Modules::Name("XML_Helper")->xmlVersion ="Hello"; // default is 333
$a =  Modules::Name("XML_Helper")->xmlVersion; // now $a should contain "Hello" 
echo $a; // prints Hello
类记录器的路径属性是公共的,因此它不是一个问题 受保护或私有财产访问

那是你的问题。发件人:


这表明
\uu set()
不是为公共属性而调用的。

我知道你已经说过path是公共的,但是仍然值得一提的是:如果你使用的是PHP5.3.0+,请注意以下的怪癖:

5.3.0 |此函数检查是否存在独立于 可达性

换句话说,如果您检查
是否存在(property_存在($delegate,$property))
,则无法保证您有权访问
$delegate->$property
进行写入(或读取,但您正在尝试写入)

至于实际的故障排除:您可以尝试检查
语句是否实际执行(property_存在($delegate,$property))
。如果没有,请检查
$属性的属性


旁注:阅读您发布的代码相当困难,这使得故障排除有点困难。您能否编辑您的帖子并将其正确缩进?

您能否提供一个简单的自包含(即可复制和粘贴)示例脚本来说明问题?@VolkerK看看上面的示例这里还有一个打印数组([0]=>XML\U帮助对象([xmlVersion]=>hallo))哪一个看起来正确,但错误在哪里?这不是一个可复制粘贴的自包含示例(复制代码)。例如,
类XML\u Helper
未定义。我必须以某种方式将您提供的代码片段中的
类模块
放在一起。它是
类模块
中的模块::测试(“记录器”)
还是
类模块
中的模块::名称(“XML\U助手”)?或者这两类都存在?您正在调用
Modules::Name(“XML_Helper”)
即静态方法调用,但也有
public function Name($Name){$this->includemule($Name);
这不是静态的。对不起,这有点太多了。听说过返回新自我吗?
__set() is run when writing data to inaccessible properties.