PHP: Что делать, если я старую статический метод нестационарно - программирование
Подтвердить что ты не робот

PHP: Что делать, если я старую статический метод нестационарно

Я не занимаюсь объектно-ориентированным программированием, и у меня возникает глупый вопрос:

class test {
    public static function doSomething($arg) {
        $foo = 'I ate your ' . $arg;
        return $foo;
    }
}

Итак, правильный способ вызова метода doSomething() состоит в том, чтобы сделать test::doSomething('Pizza');, я прав?

Теперь, что произойдет, если я назову это следующим образом:

$test = new test;
$bar = $test->doSomething('Sandwich');

Я тестировал его, и он работает без каких-либо ошибок или уведомлений или т.д., но верно ли это для этого?

4b9b3361

Ответ 1

Как уже указывал Баба, в зависимости от вашей конфигурации это приводит к E_STRICT.

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

Если у вас есть иерархия классов, например

class A {
    public static function sayHello() {
        echo "Hello from A!\n";
    }

    public function sayHelloNonStaticWithSelf() {
        return self::sayHello();
    }

    public function sayHelloNonStaticWithStatic() {
        return static::sayHello();
    }
}

class B extends A {
    public static function sayHello() {
        echo "Hello from B!\n";
    }

    public function callHelloInMultipleDifferentWays() {
        A::sayHello();
        B::sayHello();
        $this->sayHelloNonStaticWithSelf();
        $this->sayHelloNonStaticWithStatic();
        $this->sayHello();
    }
}

$b = new B();
$b->callHelloInMultipleDifferentWays();

Это приводит к следующему выводу:

Hello from A!
// A::sayHello() - obvious

Hello from B!
// B::sayHello() - obvious

Hello from A!
// $this->sayHelloNonStaticWithSelf()
// self alweays refers to the class it is used in

Hello from B!
// $this->sayHelloNonStaticWithStatic()
// static always refers to the class it is called from at runtime

Hello from B!
// $this->sayHello() - obvious

Как вы можете видеть, легко добиться неожиданного поведения при смешивании статических и нестатических вызовов и методов метода.

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

Ответ 2

Лучше вы называете это таким образом, чтобы избежать E_STRICT на некоторой версии PHP

$bar = test::doSomething('Sandwich');

FROM PHP DOC

Статические свойства не могут быть доступны через объект с помощью оператора стрелки → . Вызов нестатических методов статически генерирует предупреждение уровня E_STRICT.

Также

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

Ответ 3

Не имеет значения, не использует ли ваш метод $this и не имеет доступа к статическим свойствам.

Статические свойства не могут быть доступны через объект с помощью оператора стрелки → .

$это не доступно внутри метода, объявленного как static.

Но вы всегда должны использовать :: для вызова статического метода, даже через php вы можете вызвать его в экземпляре.