我最近一直在加强我的PHP游戏。来自JavaScript,我发现对象模型有点简单易懂。
我遇到了一些我想要澄清的怪癖,我似乎无法在文档中找到。
在PHP中定义类时,您可以定义如下属性:
class myClass {
public $myProp = "myProp";
static $anotherProp = "anotherProp";
}
使用$myProp
的公共变量,我们可以使用(假设myClass
在名为$myClass
)$myClass->myProp
的变量中引用而不使用美元符号来访问它。
我们只能使用::
访问静态变量。因此,我们可以使用美元符号访问静态变量$myClass::$anotherProp
。
问题是,为什么我们必须使用美元符号::
而不是->
??
修改
这是我认为会起作用的代码(并且确实如此):
class SethensClass {
static public $SethensProp = "This is my prop!";
}
$myClass = new SethensClass;
echo $myClass::$SethensProp;
答案 0 :(得分:16)
使用::
范围运算符访问class constant,没有美元符号,因此需要$
来区分静态类属性和类常量。
class myClass {
public static $staticProp = "static property";
const CLASS_CONSTANT = 'a constant';
}
echo myClass::CLASS_CONSTANT;
echo myClass::$staticProp;
因此,要访问变量,$
是必需的。但$
不能放在类名$myClass::staticProp
的开头,因为解析器无法识别类名,因为也可以使用变量作为类名。因此必须附在酒店附近。
$myClass = "SomeClassName";
// This attempts to access a constant called staticProp
// in a class called "SomeClassName"
echo $myClass::staticProp;
// Really, we need
echo myClass::$staticProp;
答案 1 :(得分:0)
有时,引用基类中的函数和变量或引用尚未包含任何实例的类中的函数是有用的。正在使用::运算符。
<?php
class A
{
function example()
{
echo "I am the original function A::example().<br>\n";
}
}
class B extends A
{
function example()
{
echo "I am the redefined function B::example().<br>\n";
A::example();
}
}
// there is no object of class A.
// this will print
// I am the original function A::example().<br>
A::example();
// create an object of class B.
$b = new B;
// this will print
// I am the redefined function B::example().<br>
// I am the original function A::example().<br>
$b->example();
?>
上面的例子在类A中调用函数example(),但是没有类A的对象,所以我们不能写$ a-&gt; example()或类似的。相反,我们将example()称为“类函数”,即作为类本身的函数,而不是该类的任何对象。
有类函数,但没有类变量。实际上,在通话时根本没有任何对象。因此,类函数可能不使用任何对象变量(但它可以使用本地和全局变量),并且根本不使用$ this。
在上面的例子中,B类重新定义了函数example()。 A类中的原始定义是阴影的,不再可用,除非您特别指的是使用:: - 运算符在A类中实现example()。编写A :: example()来执行此操作(实际上,您应该编写parent :: example())。
在此上下文中,有一个当前对象,它可能有对象变量。因此,当从WITHIN对象函数使用时,您可以使用$ this和对象变量。