Классы PHP: когда использовать: vs. ->?
Я понимаю, что есть два способа доступа к классу PHP - "::" и "->". Иногда мне кажется, что одно работает на меня, а другое - нет, и я не понимаю, почему.
Каковы преимущества каждого из них и в какой ситуации их следует использовать?
7 answers
Проще говоря, ::
предназначен для свойств уровня класса , а ->
- для свойств уровня объекта .
Если свойство принадлежит классу, используйте ::
Если свойство принадлежит экземпляру класса , используйте ->
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
. (Примечание, вы должны удалить ключевое слово static) Т.Е.:
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 может сбивать с толку в этом отношении, вам следует прочитать это.
Что также сбивает с толку, так это то, что вы можете вызывать нестатические функции с помощью символа ::. Это очень странно, когда вы родом с Явы. И это, конечно, удивило меня, когда я впервые увидел это.
Например:
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 в руководстве .
Следует также отметить, что каждая статическая функция также может быть вызвана с использованием экземпляра класса, но не наоборот.
Итак, это работает:
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
Конечно, вы должны ограничиться вызовом статических методов статическим способом, потому что создание экземпляра не только требует памяти, но и не имеет особого смысла.
Это объяснение было главным образом для того, чтобы проиллюстрировать, почему оно иногда срабатывало для вас.
Источник Википедия - Класс
В объектно-ориентированном программировании класс - это конструкция языка программирования, которая используется в качестве схемы элементов для создания объектов. Эта схема элементов описывает состояние и поведение, общие для всех созданных объектов. Объект, созданный классом, является экземпляром класса, и класс , создавший этот экземпляр, может рассматриваться как тип этого объекта, например, тип объекта, созданного "Фруктом". класс был бы "Фруктовым".
Оператор ::
обращается к методам и свойствам класса, которые определены в php с помощью ключевого слова static
. Доступ к классу const
также осуществляется с помощью ::
Оператор ->
обращается к методам и свойствам экземпляра класса.
Если функция работает с экземпляром, вы будете использовать ->
. Если он работает с самим классом, вы будете использовать ::
Другое использование ::
может быть, когда вы хотите позвонить своему parent
функции. Если один класс наследует другой - он может переопределять методы родительского класса, а затем вызывать их с помощью parent::function()
::
используется для доступа к статическому свойству класса. И ->
используется для доступа к свойству экземпляра класса (объекта).
Рассмотрим этот класс продуктов, который имеет две функции для получения сведений о продукте. Одна функция 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() {
}
}