В php мы можем получить доступ к статическим функциям-членам, используя объекты класса. Может кто-нибудь сказать, пожалуйста, любое практическое использование этой функции - PullRequest
2 голосов
/ 13 ноября 2010

В php мы можем вызывать статические функции-члены, используя объекты класса.Например,

class Human
{
    public static function Speak()
    {
        echo "I am a human.";
    }
}

$human = new Human();
$human->Speak();

Мы ожидаем, что статическая функция-член может вызываться только с использованием имени класса, а не переменной экземпляра класса (объекта).Но то, что я видел во время программирования, это то, что php позволяет вызывать статическую функцию-член, используя также объект класса.Есть ли практическое применение или какая-то важная причина, по которой эта функция была предоставлена ​​в php?

Эта функция также существует в java и c ++.Спасибо Оли за то, что указал на это в своем ответе.

Ответы [ 3 ]

2 голосов
/ 13 ноября 2010

Это то же самое, что и в других языках OO, таких как C ++ и Java.Почему вы хотите, чтобы переводчик запретил это?

ОБНОВЛЕНИЕ

Моя лучшая догадка для этого (а это только предположение) "для удобства".По сути, почему пользователь вашего класса должен заботиться о том, является ли данная функция-член статической или нет?В некоторых обстоятельствах это, безусловно, будет иметь значение;в других, может и нет.Я не говорю, что это большое оправдание, но это все, что я могу придумать!

1 голос
/ 13 ноября 2010

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

0 голосов
/ 13 ноября 2010

Я не могу ответить за PHP (или вообще за что-либо), но рассмотрим гипотетический C ++:

class base{
public:
    static void speak(){cout<<"base\n";}
};

class sub :public base {
public: 
    static void speak(){cout<<"sub\n"; }
};

int _tmain(int argc, _TCHAR* argv[]){

    base *base1 = new base();
    base1->speak();

    sub *sub1 = new sub();
    sub1->speak();

    base *sub2 = new sub();
    sub2->speak();
    ((sub*)sub2)->speak();
}

Вывод будет:

base
sub
base
sub

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

...