php: объявление статических свойств и методов - PullRequest
0 голосов
/ 11 августа 2011

Ссылаясь на http://php.net/manual/en/language.oop5.static.php,

Объявление свойств или методов класса как статических делает их доступными без необходимости создания экземпляра класса. К свойству, объявленному как статическое, нельзя получить доступ с помощью экземпляра объекта класса (хотя статический метод может).

Почему в примере создается экземпляр класса ($ foo = new Foo ();) перед печатью $ foo :: $ my_static? Согласно приведенному выше заявлению только

  print Foo::$my_static

ИЛИ

  $classname = 'Foo';
  print $classname::$my_static 

правильно.

example1.php

     public function staticValue() {
     return self::$my_static;
     }
 }

  class Bar extends Foo
 {
    public function fooStatic() {
    return parent::$my_static;
  }
}


 print Foo::$my_static . "\n";

 $foo = new Foo();
 print $foo::$my_static . "\n";
 $classname = 'Foo';
 print $classname::$my_static . "\n"; // As of PHP 5.3.0

     ?> 

example2.php

<?php
   class Foo{
        static $myVar="foo";
        public static function aStaticMethod(){
    return self::$myVar;
}
  }

 $foo=new Foo;
 print $foo->aStaticMethod();
?>

Приведенный выше пример не дает никакой ошибки. Это хорошая практика для доступа к статическому методу с экземпляром объекта класса?

спасибо.

Ответы [ 2 ]

3 голосов
/ 11 августа 2011

Я думаю, что описание, которое вы цитируете, немного неясно / неоднозначно.Они ссылаются на $foo->my_static, что невозможно.Позже это повторяется в этом утверждении:

Статические свойства не могут быть доступны через объект, используя оператор стрелки ->.

$foo::$my_static, хотя возможно.Экземпляр объекта просто заменяет имя класса, он на самом деле не меняет способ использования статического свойства и в основном является ярлыком удобства.

1 голос
/ 11 августа 2011

Почти во всех языках программирования ОО вы можете получить доступ к статическим членам через экземпляр класса.В C ++ это разрешено, в Java это разрешено (хотя и выдает предупреждение).

Причина доступа к статике через имя класса, а не через экземпляр класса, главным образом, связана с удобочитаемостью, поэтому я предлагаю вамсделай то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...