Я понимаю, что есть два способа доступа к классу PHP - "::" и "- > ". Когда-то мне кажется, что работает для меня, а у другого нет, и я не понимаю, почему.
Каковы преимущества каждого из них и какова правильная ситуация для использования?
Я понимаю, что есть два способа доступа к классу PHP - "::" и "- > ". Когда-то мне кажется, что работает для меня, а у другого нет, и я не понимаю, почему.
Каковы преимущества каждого из них и какова правильная ситуация для использования?
Проще говоря, ::
предназначен для свойств класса, а ->
- для свойств уровня объекта.
Если свойство принадлежит классу, используйте ::
Если свойство принадлежит экземпляру класса, используйте ->
class Tester
{
public $foo;
const BLAH;
public static function bar(){}
}
$t = new Tester;
$t->foo;
Tester::bar();
Tester::BLAH;
Символ "::" предназначен для доступа к методам/свойствам объекта, который был объявлен с ключевым словом static, "- > " предназначен для доступа к методам/свойствам объекта, которые представляют методы/свойства экземпляра.
Когда вы объявляете класс, он по умолчанию "статический". Вы можете получить доступ к любому методу в этом классе с помощью оператора ::
и в любой области. Это означает, что если я создам класс lib, я могу получить к нему доступ туда, где захочу, и он не должен быть глобальным:
class lib
{
static function foo()
{
echo "hi";
}
}
lib::foo(); // prints hi
Теперь, когда вы создаете экземпляр этого класса с помощью ключевого слова new
, вы используете ->
для доступа к методам и значениям, потому что вы ссылаетесь на этот конкретный экземпляр класса. Вы можете думать о ->
как inside of
. (Заметьте, вы должны удалить статическое ключевое слово) IE:
class lib
{
function foo()
{
echo "hi";
}
}
$class = new lib;
$class->foo(); // I am accessing the foo() method INSIDE of the $class instance of lib.
Php может сбивать с толку в этом отношении, вы должны прочитать this.
Что также сбивает с толку, так это то, что вы можете вызывать нестатические функции с символом::. Это очень странно, когда вы приходите из Java. И это, конечно, удивило меня, когда я впервые увидел это.
Например:
class Car
{
public $name = "Herbie <br/>";
public function drive()
{
echo "driving <br/>";
}
public static function gas()
{
echo "pedal to the metal<br/>";
}
}
Car::drive(); //will work
Car::gas(); //will work
$car = new Car();
$car->drive(); // will work
$car->gas(); //will work
echo $car->name; // will work
echo Car::$name; // wont work error
Как вы видите, в php очень много ошибок. И вы можете вызвать любую функцию с символами → и::. Но есть разница, когда вы вызываете с:: не существует $этой ссылки на экземпляр. См. Пример № 1 в manual.
Следует также отметить, что каждая статическая функция также может быть вызвана с использованием экземпляра класса, но не наоборот.
Итак, это работает:
class Foo
{
public static function bar(){}
}
$f = new Foo();
$f->bar(); //works
Foo::bar(); //works
И это не так:
class Foo
{
protected $test="fddf";
public function bar(){ echo $this->test; }
}
$f = new Foo();
$f->bar(); //works
Foo::bar(); //fails because $this->test can't be accessed from a static call
Конечно, вы должны ограничить себя вызовом статических методов статическим способом, потому что экземпляр экземпляра не только стоит памяти, но и не имеет большого смысла.
Это объяснение было главным образом для иллюстрации того, почему это сработало для вас в некоторые моменты времени.
Sourcing WikiPedia - класс
В объектно-ориентированном программировании class - это язык программирования конструкция, которая используется в качестве плана для создания объектов. Этот проект описывает состояние и поведение, которое все созданные объекты. объект, созданный классом, является экземпляр класса и класс который создал этот экземпляр, может быть рассматриваемый как тип этого объекта, например тип объекта, созданного Класс "Фрукты" будет "Фруктом".
Оператор ::
обращается к методам и свойствам класса, которые определены в php с использованием ключевого слова static
. Класс const
также доступен с помощью ::
Оператор ->
обращается к методам и свойствам экземпляра класса.
Если функция работает с экземпляром, вы будете использовать ->
. Если он работает с самим классом, вы будете использовать ::
Другое использование ::
будет состоять в том, когда вы хотите вызвать свои функции parent
. Если один класс наследует другой - он может переопределять методы из родительского класса, а затем вызывать их с помощью parent::function()