Классы PHP: когда использовать :: vs. ->? - PullRequest
22 голосов
/ 04 августа 2009

Я понимаю, что есть два способа получить доступ к классу PHP - "::" и "->". Иногда мне кажется, что один работает, а другой нет, и я не понимаю, почему.

Каковы преимущества каждого из них и в какой ситуации их использовать?

Ответы [ 7 ]

59 голосов
/ 04 августа 2009

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

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

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

class Tester
{
  public $foo;
  const BLAH;

  public static function bar(){}
}

$t = new Tester;
$t->foo;
Tester::bar();
Tester::BLAH;
8 голосов
/ 04 августа 2009

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

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

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

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

Теперь, когда вы создаете экземпляр этого класса с помощью ключевого слова new, вы используете -> для доступа к методам и значениям, потому что вы ссылаетесь на этот конкретный экземпляр класса. Вы можете думать о -> как inside of. (Обратите внимание, вы должны удалить ключевое слово 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.
3 голосов
/ 04 августа 2009

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

1 голос
/ 04 сентября 2018

:: используется для доступа к статическому свойству класса. И -> используется для доступа к свойству экземпляра класса (Object's).

Рассмотрим этот класс Product, который имеет две функции для получения сведений о продукте. Одна функция getProductDetails принадлежит экземпляру класса, а другая getProductDetailsStatic принадлежит только классу.

class Product {
  protected $product_id;

  public function __construct($product_id) {
    $this->product_id = $product_id;
  }

  public function getProductDetails() {
     $sql = "select * from products where product_id= $this->product_id ";
     return Database::execute($sql);
  }

  public static function getProductDetailsStatic($product_id) {
     $sql = "select * from products where product_id= $product_id ";
     return Database::execute($sql);
  }
}

Давайте получим продукты:

$product = new Product('129033'); // passing product id to constructor
var_dump( $product->getProductDetails() ); // would get me product details

var_dump( Product::getProductDetailsStatic('129033') ); // would also get me product details

Когда вам использовать Static properties?

Рассмотрим этот класс, который может не требовать создания экземпляра:

class Helper {
  static function bin2hex($string = '') {
  }
  static function encryptData($data = '') {
  }
  static function string2Url($string = '') {
  }
  static function generateRandomString() {
  }
}
1 голос
/ 04 августа 2009

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

Так что это работает:

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

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

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

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

Sourcing WikiPedia - Класс

В объектно-ориентированном программировании класс это язык программирования конструкция, которая используется в качестве плана создавать объекты. Этот план описывает состояние и поведение, все созданные объекты делятся. Объект, созданный классом, является экземпляр класса, и класс который создал этот экземпляр может быть рассматривается как тип этого объекта, например тип объекта, созданного Класс «Фрукты» будет «Фрукты».

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

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

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

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

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