Должна ли функция использоваться как в статическом, так и в объектном контексте - PullRequest
2 голосов
/ 09 июля 2010

В коде моей компании я вижу функции, используемые как в статическом, так и в объектном контексте. Например, класс A имеет функцию b (), которая вызывается как с использованием A :: b (), так и / или object_of_type_A-> b (). Я знаю, что это выдает ошибку, если строгий включен. Но я хотел знать, если это плохая практика, и если да, то почему? Спасибо за любые ответы.

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

Ответы [ 4 ]

7 голосов
/ 09 июля 2010

Я не php парень, но это звучит так же, как Java, где это разрешено, но не рекомендуется.

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

На Java лучшим примером этого является Thread.sleep(). Это статический метод, который всегда переводит текущий поток в спящий режим. Но посмотрите на этот код:

Thread t = new Thread(someTask);
t.start();
t.sleep(1000);

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

Thread.sleep(1000);

Это не относится к t, поэтому должно соответствовать текущему потоку.

Если в php нет чего-то особенного, когда вызов статического метода через переменную дает вам какой-то полиморфизм, я советую вам вызывать его статическим способом. Тот факт, что строгий режим говорит вам сделать это, довольно сильный намек, IMO:)

2 голосов
/ 09 июля 2010

Вот некоторый тестовый код:

<?php

error_reporting(E_ALL | E_STRICT);

class Foo{
    public function a(){
    }
    public static function b(){
    }
}

$MyFoo = new Foo;
Foo::a(); // Strict Standards: Non-static method Foo::a() should not be called statically
Foo::b();
$MyFoo->a();
$MyFoo->b(); // No complaints

?>

PHP / 5.3 предупреждает о статических вызовах нестатических методов, и это нормально, поскольку они могут стать причиной сбоя, как только вы захотите получить доступ к $this.Но он не жалуется на вызовы контекста объекта для статических функций: ничто не может пойти не так. Это поведение задокументировано :

Объявление свойств или методов класса как статических делает их доступными без необходимости создания экземпляра класса.Свойство, объявленное как статическое, не может быть доступно с экземпляром объекта класса (хотя статический метод может) [...] Поскольку статические методы могут вызываться без экземпляра созданного объекта, псевдопеременная $ this не доступна внутриМетод объявлен как static.

Итак, что касается PHP, то, что вы нашли в базе кода, не является неправильным.Тем не менее, я думаю, что это немного сбивает с толку.

1 голос
/ 09 июля 2010

Относительно доступа к $ this в статической функции я обнаружил что-то немного странное некоторое время назад (хотя это может быть изменено в более поздних версиях PHP, хотя, думаю, я запустил 5.2 или что-то в этом роде).

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

http://www.phpportalen.net/viewtopic.php?p=560080#560080

1 голос
/ 09 июля 2010

«В настоящее время» нет никакого вреда в использовании его в любом случае, кроме случаев, когда он вызывается как статическая функция, вы не можете получить доступ к члену $ this.

Причина, по которой ошибки являются строгими, заключается в том, что несоблюдение правил написания кода может привести к ошибкам из-за недостатка усердия. в будущем это также может привести к поломке вашего кода. статическая функция не имеет $ this member и может нарушить передачу параметров.

Будьте осторожны, вызывайте только статические функции с вызовами типа A :: b ().

DC

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