какой смысл объявлять статические функции в PHP?
Так что в PHP вы можете иметь
Class A{
function B(){}
}
и вы можете назвать это, как если бы это была статическая функция:
A::B();
мой вопрос...если я могу это сделать, то почему я должен объявлять функцию B () статической, так как это делает $this недоступной, поэтому меньше гибкости, поэтому вам есть что терять, но ничего не получить...
или есть преимущество объявления функции как статической, о которой я не знаю?
также я слышал, что "статические вызовы нестатических методов "являются " устаревшими"....что именно это означает, особенно в отношении этого сценария? зовет A::B()
когда B () не объявляется статическим, что я не должен делать? если да, то почему?
4 ответов
потому что PHP имеет тенденцию быть немного рыхлым вокруг строгости (? такие вещи работают. Тот факт, что они устарели, означает, что когда-нибудь в будущем выпуске это, вероятно,не больше работать. Поэтому, если вы вызываете нестатическую функцию в статическом контексте, ваша программа может сломаться в будущем обновлении PHP.
Что касается использования его прямо сейчас-преимущество объявления функции как статической заключается в том, что вы решаете, как эта функция должна быть используемый. Если вы собираетесь использовать функцию в статическом контексте, вы все равно не можете использовать $this, поэтому вам лучше просто быть ясным в том, что вы планируете делать. Если вы хотите использовать функцию статически, сделайте ее статической. Если нет, то нет. Если вы хотите использовать функцию статически, а не статически, то, пожалуйста, проверьте ваши требования :П
в режиме совместимости. Теперь вызов нестатических методов статически генерирует предупреждение уровня E_STRICT.
Почему статический и не экземпляр объекта? Каждый программист скажет вам причину. I particulary preffer создает экземпляр объекта, чем использовать статические методы. Это ясно, прослеживается и более многоразовые.
Я сделал тестовый стенд, и разница была минимальной между instantiate и вызовом метода, чем вызвать его статически.
совет: если вы предполагаете звонить методы статически определяют их также; -)
во-первых, вы не могли делать такие вещи в своем посте на строгом типизированном языке, таком как Java. Код Java не компилируется, если вы вызываете нестатический материал в статическом контексте. PHP не так строг в этих вещах (пока), но все же вы не должны делать вещи только потому, что можете, хотя это плохая практика, а в некоторых языках даже "неправильная" практика.
там конечно преимущества используя статические методы. И это не совсем правильно, что вы ничего не получить или даже потерять гибкость. Приведем пример:
class A {
private static $prop_a = 'property_a';
public static function b() {
echo 'called b()';
echo self::$prop_a;
$A = new A();
$A->c();
}
public function c() {
echo 'called c()';
}
}
теперь мы можем назвать класс таким образом:
A::b();
выходы
- called_b
- property_a
- called_c
но вы можете сделать то же самое с:
$a = new A();
$a->b();
$a->c();
c()
выполняется дважды, но вы получаете идею. В вашем классе, вы можете instanciate класс и работать с ним как с обычным объектом. Но снаружи, это просто одна линия кода, пока это 3 строки, используя нестатический способ. Круто, да?
и, как вы видите, вы можете использовать статическую функцию в нестатическом контексте, что означает, что вы можете объявить свой метод статическим, но если вы создаете экземпляр своего класса, вы можете просто назвать его как обычный метод. Звучит довольно гибко для меня;)
и нет, вы не можете использовать $this
в статическом контексте, но это то, что self
для ;)
Если это статическая функция, вам не нужно создавать экземпляр класса, чтобы использовать метод.
Class A {
static function hello($arg)
{
echo 'Hello, ' . $arg;
}
}
A::hello('world');
VS
Class A {
public function hello($arg)
{
echo 'Hello, ' . $arg;
}
}
$a = new A;
$a->hello('world');
важным здесь является создание экземпляра объекта. После создания экземпляра объекта им можно управлять, а вызов методов может привести к неожиданным результатам. Если ваши значения и функции статически объявлены в классе, их нельзя изменить во время вызова функции.
Это не скажите, что вы всегда должны использовать статические методы. возьмем следующий пример.
class My_math {
static function pi()
{
return 3.14
}
}
class My_bakery {
private var $pie;
function set_pie($pie)
{
$this->pie = $pie;
}
function pie()
{
echo "I made you a " . $this->pie . "pie";
}
}
Я заставил My_Math возвращать постоянное значение, потому что я знаю, что pi не меняется. Но в My_bakery, несколько дней я хочу черничный пирог и пирог с персиками.