とても混乱しています
<!-- 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?! :) */ ?>
クラスcA { /*** 直接デフォルト値を使用するためのテスト プロパティ * 直接のデフォルト値を使用してプロパティをテストする*/ protected static $item = 'Foo'; /*** 間接的なデフォルト値を使用するためのテスト プロパティ * 間接的なデフォルト値を使用してプロパティをテストする*/ protected static $other = 'cA'; パブリック静的関数メソッド() { __METHOD__ . ' ' . __CLASS__ . self::$item."rn"; __METHOD__ . ' ' . __CLASS__ . self::$other."rn"; } パブリック静的関数 setOther($val) { self::$other = $val; // このスコープに値を設定します。 } } クラス cB は cA を拡張します { /*** 再定義されたデフォルト値を使用してプロパティをテストします * デフォルト値のテスト属性を再定義しました*/ protected static $item = 'Bar'; パブリック静的関数 setOther($val) { self::$other = $val; } } クラス cC は cA を拡張します { /*** 再定義されたデフォルト値を使用してプロパティをテストします * デフォルト値のテスト属性を再定義しました*/ protected static $item = 'Tango'; パブリック静的関数メソッド() { __METHOD__ . ' ' . __CLASS__ . self::$item."rn"; __METHOD__ . ' ' . __CLASS__ . self::$other."rn"; } /*** setOther() メソッドの再宣言を削除し、楽しみのために cA を 'self::' とともに使用します。*/ } クラス cD は cA を拡張します { /*** 再定義されたデフォルト値を使用してプロパティをテストします * デフォルト値のテスト属性を再定義しました*/ protected static $item = 'フォックストロット'; /*** この問題を解決するために、すべてのメソッドの再宣言を削除します。 * この問題を解決するために、すべての再宣言方法を放棄します。*/ } cB::setOther('cB'); // cB::method() です! cB::method(); // cA::method() です! cC::setOther('cC'); // cA::method() です! cC::method(); // cC::method() です! cD::setOther('cD'); // cA::method() です! cD::method(); // cA::method() です! <div class="clear"></div>