Есть два разных способа доступа к методам в PHP, но в чем разница?
$response->setParameter('foo', 'bar');
и
sfConfig::set('foo', 'bar');
Я предполагаю ->
(тире со знаком больше, чем знак или шеврон) используется для функций для переменных, и::
(двойные двоеточия) используется для функций для классов. Верный?
Является ли =>
оператор присваивания используется только для назначения данных в массиве? Это в отличие от =
оператора присваивания, который используется для создания или изменения переменной?
Ответы:
Когда левая часть является экземпляром объекта, вы используете
->
. В противном случае вы используете::
.Это означает, что
->
в основном используется для доступа к членам экземпляра (хотя он также может использоваться для доступа к статическим членам, такое использование не рекомендуется), в то время как::
обычно используется для доступа к статическим членам (хотя в некоторых особых случаях он используется для доступа к членам экземпляра). ).Как правило,
::
используется для разрешения области видимости и может иметь либо имя классаparent
,self
либо, либо (в PHP 5.3)static
слева от него.parent
относится к области действия суперкласса класса, в котором он используется;self
относится к области действия класса, в котором он используется;static
относится к «вызываемой области видимости» (см. поздние статические привязки ).Правило состоит в том, что вызов with
::
является вызовом экземпляра тогда и только тогда, когда:$this
существует и$this
- это либо класс вызываемого метода, либо его подкласс.Пример:
Вывод:
источник
->
основном используется для доступа к членам экземпляра (хотя он также может использоваться для доступа к статическим членам, такое использование не рекомендуется)» Я не знал, что это может быть. Так что, если он «функционирует» каким-то образом, когда используется для доступа к статическим элементам - какую разницу в поведении можно ожидать, если использовать его неправильно, как это? Просто из любопытства.->
. Конечно, вам может понадобиться создать экземпляр класса просто для вызова статического метода, так что есть также снижение производительности. Со свойствами, однако, есть больше проблем. СТРОГО предупреждение выдано, и оно может или не может работать . Обратите внимание, что верно и обратное - вы можете вызывать метод экземпляра статически, но это еще хуже (и вы не можете использовать$this
в такой реализации метода).::
используется в статическом контексте, т.е. когда какой-либо метод или свойство объявлено как статическое:Кроме того,
::
оператор (оператор разрешения области действия, также известный как Paamayim Nekudotayim ) используется в динамическом контексте, когда вы вызываете метод / свойство родительского класса:->
используется в динамическом контексте, т.е. когда вы имеете дело с некоторым экземпляром некоторого класса:Кстати: я не думаю, что использование Symfony - это хорошая идея, когда у вас нет опыта ООП.
источник
На самом деле с помощью этого символа мы можем вызвать метод класса, который является статическим и не зависит от другой инициализации ...
Здесь
doWrite()
функция не зависит от любого другого метода или переменной и является статическим методом. Вот почему мы можем вызывать этот метод этим оператором без инициализации объекта этого класса.Test::doWrite('Mrinmoy'); // Output: Hello Mrinmoy.
Но если вы захотите вызвать
write
метод таким способом, он выдаст ошибку, потому что он зависит от инициализации.источник
=>
Оператор используется для присвоения пар ключ-значение в ассоциативном массиве. Например:Это значение похоже на
foreach
утверждение:источник
Разница между статическими и экземплярами методов и свойств представляется одним из главных препятствий для тех, кто только начинает работать с ООП PHP в PHP 5.
Оператор с двойным двоеточием (называемый Paamayim Nekudotayim с иврита - пустяки) используется при вызове объекта или свойства из статического контекста. Это означает, что экземпляр объекта еще не создан.
Оператор стрелки, наоборот, вызывает методы или свойства, которые ссылаются на экземпляр объекта.
Статические методы могут быть особенно полезны в объектных моделях, которые связаны с базой данных для методов создания и удаления, поскольку вы можете установить возвращаемое значение для вставленного идентификатора таблицы, а затем использовать конструктор для создания экземпляра объекта по идентификатору строки.
источник
Да, я просто ударил меня первый
'PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM'
. Мой плохой, у меня было то,$instance::method()
что должно было быть$instance->method()
. Я такой глупый.Странно то, что на моем локальном компьютере это все еще работает очень хорошо (работает PHP 5.3.8) - ничего, даже предупреждения с ошибкой_портажа = E_ALL - но совсем не на тестовом сервере, там он просто взрывается с синтаксической ошибкой и белый экран в браузере. Так как логирование PHP было отключено на тестовом компьютере, и хостинговая компания была слишком занята, чтобы включить его, это было не слишком очевидно.
Итак, предупреждение: очевидно, некоторые установки PHP позволят вам использовать $ instance :: method (), а другие - нет.
Если кто-нибудь может объяснить, почему это так, пожалуйста.
источник