Статический и нестатический вызов в PHP


Хорошо, у меня есть этот код, который я изучаю

 class scope{

    function printme(){
        return "hello";
    }

    public static function printme(){
        return "hello"; 
    }

 }

$s = new scope();
echo $s->printme(); //non-static call
echo "<br>";
echo scope::printme(); //static call

На самом деле это не код моего проекта, но это то, что я хочу сделать

  1. Я хочу создать класс, который будет содержать статические и нестатические функции.
  2. Я хочу, чтобы функция была доступна как при статических, так и при нестатических вызовах.

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

ПРИМЕЧАНИЕ: скажите мне, если я уже плохо программирую.

 14
Author: Mp de la Vega, 2012-06-06

3 answers

Вот правило:

Статический метод может использоваться как в статическом методе, так и в нестатическом методе.

Нестатический метод может использоваться только в нестатическом методе.

 35
Author: xdazz, 2017-07-07 08:41:32

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

class Scope {
    public function mynonstatic() {
    }

    public static function mystatic() {
        $s = new Scope();
        return $s->mynonstatic();
    }
}

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

 6
Author: walrii, 2012-06-06 03:27:25

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

Если вам нужно, чтобы он был статичным, сделайте его статичным. Если вам это не нужно, то оставьте все как есть. Из нестатической функции можно вызвать статическую функцию.

class Foo
{
    public function bar()
    {
        Foo::zex();

        // or self::zex() or even $this->zex();
    }

    public static function zex()
    {
    }
}


$foo    = new Foo;
$foo->bar();

Муравей в другую сторону вокруг.

class Foo
{
    public function bar()
    {

    }

    public static function zex()
    {
        $foo    = new Foo;
        $foo->bar();
    }
}

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

 2
Author: Gajus, 2012-06-06 05:37:02