Разница между "->" и "::" в PHP MySQLi ООП - PullRequest
28 голосов
/ 07 августа 2009

Может кто-нибудь сказать разницу между mysqli->commit и mysqli::commit?

Заголовок на этой странице равен mysqli::commit, но в примерах они используют mysqli->commit.

Ответы [ 9 ]

68 голосов
/ 07 августа 2009

-> используется при обращении к члену объекта.

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

Рассмотрим следующий класс:

class FooBar {
    public static function fizz() {
        echo "Fizz";
    }

    public function buzz() {
        echo "Buzz";
    }
}

Вы бы вызвали функцию buzz(), используя ->:

$myFooBar = new FooBar();
$myFooBar->buzz();

Но будет использовать :: для вызова функции fizz(), так как это статический член (член, который не требует вызова экземпляра класса):

FooBar::fizz();

Кроме того, хотя мы говорим о разнице между статическими членами и инстанцированными членами, вы не можете использовать $this для ссылки на текущий экземпляр в static участники. Вместо этого вы используете self (без начального $), который относится к текущему классу, или parent, если вы хотите обратиться к родительскому классу или если у вас есть удовольствие от работы с PHP 5.3.0, static (что позволяет позднее статическое связывание).


Документация использует :: для ссылки на функцию внутри класса, поскольку имя класса в заголовке не является экземпляром класса. Продолжая использовать тот же пример, запись документации, относящаяся к функции buzz(), будет использовать следующий заголовок:

FooBar::buzz

Но если в документации не указано, что это статический член, вам нужно будет использовать -> в экземпляре для его вызова:

$myFooBar = new FooBar();
$myFooBar->buzz();
5 голосов
/ 07 августа 2009

:: используется для статических методов .

-> используется для метода объекта, если у вас уже есть экземпляр.

4 голосов
/ 07 августа 2009

Если у вас есть экземпляр объекта, вы используете -> для ссылки на метод внутри этого экземпляра:

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

Использование :: вызывает статический метод без необходимости создания экземпляра объекта:

Foo::bar();

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

1 голос
/ 07 августа 2009

:: определяет статический (класс) метод, который вызывается без фактического создания объекта. -> указывает метод экземпляра (объекта), для которого вам нужно создать экземпляр объекта, который можно использовать.

Так, например, если у вас есть переменная $m, которая была экземпляром класса mysqli, вы бы вызвали commit, сказав $m->commit(), или вы могли бы вызвать статически, сказав MySQLi::commit()

0 голосов
/ 07 августа 2009

обычно в документации php.net :: означает, что этот класс имеет этот метод. Для практического использования вы должны следовать примеру, поэтому используйте -> sintax.

0 голосов
/ 07 августа 2009

mysqli-> commit - это открытая функция, а mysqli :: commit - статическая функция. Обе записи - это объекты php класса mysqli.

0 голосов
/ 07 августа 2009

в mysqli-> commit, mysqli является экземпляром MySQLi в mysqli :: commit вызов статического метода

0 голосов
/ 07 августа 2009

Оператор -> предназначен для свойств объекта .

Оператор :: предназначен для свойств класса .

0 голосов
/ 07 августа 2009

:: получает доступ к функции класса без создания экземпляра объекта.

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