我知道有两种方法可以访问PHP类 - “::”和“ - >”。有时一个似乎对我有用,而另一个没有,我不明白为什么。
每种方法的好处是什么,使用哪种方式也是正确的?
简单地说,::
用于类级属性,->
用于对象级属性。
如果属性属于该类,请使用::
如果属性属于该类的实例,请使用->
class Tester
{
public $foo;
const BLAH;
public static function bar(){}
}
$t = new Tester;
$t->foo;
Tester::bar();
Tester::BLAH;
“::”符号用于访问已使用static关键字声明的对象的方法/属性,“ - >”用于访问表示实例方法/属性的对象的方法/属性。
声明一个类时,它默认为“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中非常松散。您可以使用 - >和::符号调用任何函数。但是当你调用::没有$这个对实例的引用时会有区别。参见manual中的示例#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
当然,您应该限制自己以静态方式调用静态方法,因为实例化实例不仅会花费内存,而且也没有多大意义。
这个解释主要是为了说明为什么它在某些时候适合你。
::
用于访问类静态属性。 ->
用于访问类实例(Object)的属性。
请考虑此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() {
}
}
在面向对象的编程中,类是一种编程语言构造,用作创建对象的蓝图。此蓝图描述了创建的对象共享的状态和行为。由类创建的对象是类的实例,并且创建该实例的类可以被视为该对象的类型,例如,由“Fruit”类创建的一种对象将是“Fruit”。
::
运算符使用static
关键字访问php中定义的类方法和属性。使用const
也可以访问类::
->
运算符访问类的实例的方法和属性。
如果函数在实例上运行,那么您将使用->
。如果它在类本身上运行,你将使用::
::
的另一个用途是当你想要调用你的parent
函数时。如果一个类继承另一个类 - 它可以覆盖父类的方法,然后使用parent::function()
调用它们