2010-08-03 75 views
2

我想将对象包装在另一个对象中 - 偏爱合成而不是继承。但我不确定我是否做对了没有错误。问题abt PHP魔术方法和授权

我创建了一个类Wrapped这就是包装Wrapper。我在$wrapper上调用方法/属性时,如果它存在于类Wrapper中,它将返回else,它将委托给$wrapped对象。我想知道除了事实我没有检查方法/财产是否存在,我做错了什么?可以解释一下__callStatic()吗?

class Wrapped { 
    protected $wrappedProp1 = 'Wrapped: Property 1'; 
    protected $wrappedProp2 = 'Wrapped: Property 2'; 

    function method1($arg1, $arg2) { 
     echo "Called Wrapped::method1() with the following parameters: $arg1, $arg2"; 
    } 

    static function sMethod2() { 
     echo 'Called a static method in wrapped'; 
    } 

    function __get($name) { 
     return $this->$name; 
    } 
    function __set($name, $val) { 
     $this->$name = $val; 
    } 
} 
class Wrapper { 
    protected $wrapperProp1 = 'Wrapper: Property 1'; 
    protected $wrapped; 

    function __construct($wrapped) { 
     $this->wrapped = $wrapped; 
    } 

    function wrapperMethod() { 
     echo 'In wrapper method'; 
    } 

    function __get($name) { 
     if (property_exists($this, $name)) { 
      return $this->$name; 
     } 
     return $this->wrapped->$name; 
    } 
    function __set($name, $val) { 
     if (property_exists($this, $name)) { 
      $this->$name = $val; 
     } 
     $this->wrapped->$name = $val; 
    } 
    function __call($name, $args = array()) { 
     call_user_func_array(array($this->wrapped, $name), $args); 
    } 
    static function __callStatic($name, $args = array()) { 
     call_user_func_array(array('Wrapped', $name), $args); 
    } 
} 

$wrapper = new Wrapper(new Wrapped); 

// testing normal methods 
$wrapper->wrapperMethod(); 
echo $wrapper->wrapperProp1; 
$wrapper->wrapperProp1 = 'New Wrapper Prop 1'; 
echo $wrapper->wrapperProp1; 

// testing delegates 
$wrapper->method1('hello', 'world'); //delegated to Wrapped::method1() 
$wrapper->sMethod2(); // delegated to static Wrapped::sMethod2() ... what is callStatic for then 
echo $wrapper->wrappedProp2; 
Wrapper::sMethod2(); 

回答

1

因为看起来 - 一切都好。

关于__callStatic() - 它允许您在类中解决未定义的静态函数。例如:

<?php 
class Foo { 
    static function __callStatic($name, $args = array()) { 
     echo "Called static function $name with arguments ". print_r($args, true); 
    } 
} 

Foo::Bar('test'); 
// will output "Called static function Bar with arguments Array (0 => test);"