9

我最近一直在加强我的 PHP 游戏。来自 JavaScript,我发现对象模型更易于理解。

我遇到了一些怪癖,我想澄清一下我似乎在文档中找不到的东西。

在 PHP 中定义类时,您可以像这样定义属性:

class myClass {

    public $myProp = "myProp";
    static $anotherProp = "anotherProp";

}

使用 public 变量,$myProp我们可以使用(假设myClass在名为 的变量中引用$myClass)访问它,$myClass->myProp而无需使用美元符号。

我们只能使用::. $myClass::$anotherProp因此,我们可以像使用美元符号一样访问静态变量。

问题是,为什么我们必须使用美元符号::而不是->

编辑

这是我认为可以工作(并且确实)的代码:

class SethensClass {

    static public $SethensProp = "This is my prop!";

}

$myClass = new SethensClass;
echo $myClass::$SethensProp;
4

2 回答 2

18

使用范围运算符访问类常量,没有美元符号,因此需要在此处区分静态类属性和类常量。::$

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;
于 2013-03-12T16:35:55.287 回答
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->example()之类的。相反,我们将 example() 称为“类函数”,即作为类本身的函数,而不是该类的任何对象。

有类函数,但没有类变量。事实上,在调用的时候根本没有任何对象。因此,类函数可能不使用任何对象变量(但它可以使用局部变量和全局变量),并且可能根本不使用 $this。

在上面的例子中,B 类重新定义了函数 example()。类 A 中的原始定义被隐藏并且不再可用,除非您使用 :: 运算符专门引用类 A 中 example() 的实现。编写 A::example() 来执行此操作(实际上,您应该编写 parent::example())。

在这种情况下,有一个当前对象,它可能有对象变量。因此,当从 WITHIN 对象函数中使用时,您可以使用 $this 和对象变量。

于 2013-03-12T16:38:21.343 回答