На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
Модераторы: Serafim, fatalist
  
    > Область видимости private function , Обращение к приватному методу изнутри класса через self::, static:: и имя другого класса.
      ExpandedWrap disabled
        class A {
         
            private static $a = 313;
            
            private static function f( ) { echo '<h3>A::f( ) is called! current class ="',get_called_class( ),'", $a = "',self::$a,'", self::h( ) = "',B::h( ),'"</h3>'; }
            private static function h( ) { echo '<b style="color:#d00;">A::h( ) is called! current class ="',get_called_class( ),'"</b>'; }
            public static function p( ) { self::f( ); }
         
        }
         
        class B extends A { }
         
        B::p( );
        B::h( );
      к методу h( ) в нутри класса A могу обратиться и через self::h( ), и через static::h( ), и через B::h( ).
      А к переменной $a только через self::$a.
      Не пому в чём разница между $a и h( ) :fool:
        В механизме наследования, вестимо.

        Добавлено
        ExpandedWrap disabled
          $r = new ReflectionClass('B');
          print_r($r->getStaticProperties());
          print_r($r->getMethods());

        В итоге: все private методы из A присутствуют в B, но private свойств там нет.
        Сообщение отредактировано: Dark Side -
          Так я и расчитывал, что private метод, как и private свойство будет доступно только классу, в котором они объявлены. А тут такая лажа.
          Мне нужно, чтоб при вызове private метода f( ) текущим классом get_called_class( ) был класс "A", поэтому вызываю метод через self::f( ); А он не помогает. Приходится явно указывать A::f( );

          забыл указать : Windows XP, PHP 5.3.24
            Цитата K313 @
            читывал, что private метод, как и private свойство будет доступно только классу, в котором они объявлены. А тут такая лажа.
            В смысле? Они и так доступны только классу, в котором они объявлены. Просто проверка идёт не по ключевому слову, а по факту наличия методов в классах.


            Цитата K313 @
            Мне нужно, чтоб при вызове private метода f( ) текущим классом get_called_class( ) был класс "A"
            В описании get_called_class вполне ясно написано, что она выводит, а для твоих целей нужна константа __CLASS__
              да, это я тормознул. :wacko: я чёта всегда думал, что задавая parent:: static:: или self:: - я устанавливаю новый текущий класс.
              Ща вроде разобрался, get_called_class( ) возвращает класс с которого началась цепочка поиска вызванного метода.
              А parent:: static:: или self:: - этот класс не меняют, а только указывают с какого класса начинать поиск метода.

              Нарисовал схемку, всё правильно? :rolleyes:
              user posted image
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0244 ]   [ 14 queries used ]   [ Generated: 13.05.24, 05:52 GMT ]