<?phpclass cA
{
    /**
     * Test property for using direct default value
     */
    protected static $item = 'Foo';
    
    /**
     * Test property for using indirect default value
     */
    protected static $other = 'cA';
    
    public static function method()
    {
        print self::$item."\r\n"; // It prints 'Foo' on everyway... :(
        print self::$other."\r\n"; // We just think that, this one prints 'cA' only, but... :)
    }
    
    public static function setOther($val)
    {
        self::$other = $val; // Set a value in this scope.
    }
}class cB extends cA
{
    /**
     * Test property with redefined default value
     */
    protected static $item = 'Bar';
    
    public static function setOther($val)
    {
        self::$other = $val;
    }
}class cC extends cA
{
    /**
     * Test property with redefined default value
     */
    protected static $item = 'Tango';
    
    public static function method()
    {
        print self::$item."\r\n"; // It prints 'Foo' on everyway... :(
        print self::$other."\r\n"; // We just think that, this one prints 'cA' only, but... :)
    }
    
    /**
     * Now we drop redeclaring the setOther() method, use cA with 'self::' just for fun.
     */
}class cD extends cA
{
    /**
     * Test property with redefined default value
     */
    protected static $item = 'Foxtrot';
    
    /**
     * Now we drop redeclaring all methods to complete this issue.
     */
}cB::setOther('cB'); // It's cB::method()!
cB::method(); // It's cA::method()!
cC::setOther('cC'); // It's cA::method()!
cC::method(); // It's cC::method()!
cD::setOther('cD'); // It's cA::method()!
cD::method(); // It's cA::method()!/**
 * Results: ->
 * Foo
 * cB
 * Tango
 * cC
 * Foo
 * cD
 * 
 * What the hell?! :)
 */?>
这是覆盖,还是什么啊?为什么输出这样啊,不能理解啊,听乱的啊。

解决方案 »

  1.   

    本帖最后由 xuzuning 于 2012-06-23 07:47:13 编辑
      

  2.   

    具体哪个输出你觉得不能理解啊?
    注意你的$item是每个类都有的, 
    而$other只在A里定义了
      

  3.   

    这样可能会清楚些class cA
    {
        /**
         * Test property for using direct default value
         * 使用直接默认值测试属性
         */
        protected static $item = 'Foo';
        
        /**
         * Test property for using indirect default value
         * 使用间接默认值测试属性
         */
        protected static $other = 'cA';
        
        public static function method()
        {
            print __METHOD__ . ' ' . __CLASS__ . '::$item=' . self::$item."\r\n";
            print __METHOD__ . ' ' . __CLASS__ . '::$otfer=' . self::$other."\r\n";
        }
        
        public static function setOther($val)
        {
            self::$other = $val; // Set a value in this scope.
        }
    }class cB extends cA
    {
        /**
         * Test property with redefined default value
         * 重新定义了默认值测试属性
         */
        protected static $item = 'Bar';
        
        public static function setOther($val)
        {
            self::$other = $val;
        }
    }class cC extends cA
    {
        /**
         * Test property with redefined default value
         * 重新定义了默认值测试属性
         */
        protected static $item = 'Tango';
        
        public static function method()
        {
            print __METHOD__ . ' ' . __CLASS__ . '::$item=' . self::$item."\r\n";
            print __METHOD__ . ' ' . __CLASS__ . '::$otfer=' . self::$other."\r\n";
        }
        
        /**
         * Now we drop redeclaring the setOther() method, use cA with 'self::' just for fun.
         */
    }class cD extends cA
    {
        /**
         * Test property with redefined default value
         * 重新定义了默认值测试属性
         */
        protected static $item = 'Foxtrot';
        
        /**
         * Now we drop redeclaring all methods to complete this issue.
         * 现在,我们放弃重新声明的所有方法来完成这个问题
         */
    }cB::setOther('cB'); // It's cB::method()!
    cB::method(); // It's cA::method()!
    cC::setOther('cC'); // It's cA::method()!
    cC::method(); // It's cC::method()!
    cD::setOther('cD'); // It's cA::method()!
    cD::method(); // It's cA::method()!
    cA::method cA::$item=Foo
    cA::method cA::$otfer=cB
    cC::method cC::$item=Tango
    cC::method cC::$otfer=cC
    cA::method cA::$item=Foo
    cA::method cA::$otfer=cD