Heim > Artikel > Backend-Entwicklung > 小弟我觉得好迷糊
我觉得好迷糊啊
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><?php 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 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?! :) */ ?>
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()! <div class="clear"> </div>