Классы PHP: когда использовать:: по сравнению с->?

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

23
задан johnnietheblack 3 August 2009 в 21:46
поделиться

6 ответов

Проще говоря, :: для свойств уровня класса, а -> для объекта- level properties.

Если свойство принадлежит классу, используйте ::

Если свойство принадлежит экземпляру класса , используйте ->

class Tester
{
  public $foo;
  const BLAH;

  public static function bar(){}
}

$t = new Tester;
$t->foo;
Tester::bar();
Tester::BLAH;
59
ответ дан 29 November 2019 в 00:50
поделиться

Символ «::» предназначен для доступа к методам / свойствам объекта, который был объявлен с помощью ключевого слова static, «->» предназначен для доступа к методам / свойствам объекта, представляющего методы / свойства экземпляра.

8
ответ дан 29 November 2019 в 00:50
поделиться

Когда вы объявляете класс, он по умолчанию является статическим. Вы можете получить доступ к любому методу в этом классе с помощью оператора :: и в любой области. Это означает, что если я создам класс lib, я могу получить к нему доступ, где захочу, и его не нужно глобализировать:

class lib
{
    static function foo()
    {
       echo "hi";
    }
}
lib::foo(); // prints hi

Теперь, когда вы создаете экземпляр этого класса с помощью ключевого слова new , вы используете -> для доступа к методам и значениям, потому что вы ссылаетесь на этот конкретный экземпляр класса. Вы можете думать о -> как о внутри . (Обратите внимание, вы должны удалить ключевое слово static) 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.
4
ответ дан 29 November 2019 в 00:50
поделиться

Следует также отметить, что каждая статическая функция также может быть вызвана с использованием экземпляра класса, но не наоборот.

Итак, это работает:

class Foo
{
  public static function bar(){}
}

$f = new Foo();
$f->bar(); //works
Foo::bar(); //works

И это не ' t:

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

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

Это объяснение было в основном для того, чтобы проиллюстрировать, почему это работает для иногда вы.

1
ответ дан 29 November 2019 в 00:50
поделиться

Php может сбивать с толку в этом отношении, вам следует прочитать это .

Еще сбивает то, что вы можете вызывать нестатические функции с помощью символа ::. Это очень странно, когда вы пришли с 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 очень свободна. И вы можете вызывать любую функцию с помощью символов -> и ::. Но есть разница, когда вы вызываете с :: нет ссылки $ this на экземпляр. См. Пример №1 в руководстве .

3
ответ дан 29 November 2019 в 00:50
поделиться

Sourcing WikiPedia - Class

В объектно-ориентированном программировании класс - это язык программирования конструкция, которая используется в качестве чертежа создавать объекты. Этот план описывает состояние и поведение, которое все созданные объекты разделяют. An объект, созданный классом, является экземпляр класса, а класс создавший этот экземпляр может быть рассматривается как тип этого объекта, например, тип объекта, созданного Класс "Fruit" будет "Fruit".

Оператор :: обращается к методам и свойствам класса, которые определены в php с помощью ключевого слова static . Доступ к классу const также осуществляется с помощью ::

Оператор -> обращается к методам и свойствам экземпляра класса.

Если функция работает с Например, вы будете использовать -> . Если он работает с самим классом, вы будете использовать ::

Другое использование :: будет, когда вы захотите вызвать свои родительские функции. Если один класс наследует другой - он может переопределять методы родительского класса, а затем вызывать их, используя parent :: function ()

0
ответ дан 29 November 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: