(php oop) статический метод vs нет статического метода

Ниже приведены примеры кода класса php, который является статическим методом и нестационарным методом.

Пример 1:

class A{ //None Static method function foo(){ if (isset($this)) { echo '$this is defined ('; echo get_class($this); echo ")<br>"; } else { echo "\$this is not defined.<br>"; } } } $a = new A(); $a->foo(); A::foo(); //result $this is defined (A) $this is not defined. 

Пример 2:

 class A{ //Static Method static function foo(){ if (isset($this)) { echo '$this is defined ('; echo get_class($this); echo ")<br>\n"; } else { echo "\$this is not defined.<br>\n"; } } } $a = new A(); $a->foo(); A::foo(); //result $this is not defined. $this is not defined. 

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

Как видно из результата статического метода, «$ this» был определен.

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

Мне интересно, почему они имеют разные результаты, поскольку оба они были созданы?

Не могли бы вы рассказать мне о том, что происходит на этих кодах.

Related of "(php oop) статический метод vs нет статического метода"

Прежде чем идти дальше: Пожалуйста, заходите в habbit, всегда определяя видимость / доступность свойств и методов вашего объекта. Вместо написания

 function foo() {//php 4 style method } 

Написать:

 public function foo() { //this'll be public } protected function bar() { //protected, if this class is extended, I'm free to use this method } private function foobar() { //only for inner workings of this object } 

во-первых, ваш первый пример A::foo вызовет уведомление (вызов статического метода статически всегда делает это).
Во-вторых, во втором примере при вызове A::foo() PHP не создает экземпляр «на лету» и не вызывает метод в контексте экземпляра, когда вы вызывали $a->foo() (который также выдает уведомление BTW). Статика – это, по сути, глобальные функции, поскольку внутренние объекты PHP – это не что иное, как struct C, а методы – это просто функции, которые имеют указатель на эту структуру. По крайней мере, в этом суть, подробности здесь

Основное различие (и при правильном использовании) статического свойства или метода заключается в том, что они разделяются по всем экземплярам и доступным глобальным:

 class Foo { private static $bar = null; public function __construct($val = 1) { self::$bar = $val; } public function getBar() { return self::$bar; } } $foo = new Foo(123); $foo->getBar();//returns 123 $bar = new Foo('new value for static'); $foo->getBar();//returns 'new value for static' 

Как вы можете видеть, статическое свойство $bar не может быть установлено для каждого экземпляра, если его значение изменено, это изменение применяется ко всем экземплярам.
Если $bar был общедоступным, вам даже не понадобится экземпляр для изменения свойства везде:

 class Bar { public $nonStatic = null; public static $bar = null; public function __construct($val = 1) { $this->nonStatic = $val; } } $foo = new Bar(123); $bar = new Bar('foo'); echo $foo->nonStatic, ' != ', $bar->nonStatic;//echoes "123 != foo" Bar::$bar = 'And the static?'; echo $foo::$bar,' === ', $bar::$bar;// echoes 'And the static? === And the static?' 

Посмотрите на заводскую модель и (чисто информативный) также загляните в шаблон Singleton. Что касается шаблона Singleton: Также google почему бы не использовать его. IoC, DI, SOLID – это аббревиатуры, с которыми вы вскоре столкнетесь. Читайте о том, что они означают и выясняют, почему они (каждый по-своему) являются главными причинами, чтобы не пойти на Singletons

Иногда вам нужно использовать метод, но вам не нужен класс вызова, потому что некоторые функции в классе называются автоматически как __construct, __destruct, … (Magic Methods).

называемый класс:

 $a = new A(); $a->foo(); 

Не вызывайте класс: (только что запустил функцию foo ())

 A::foo(); 

http://php.net/manual/en/language.oop5.magic.php