【问题标题】:PHP property access and dollar signPHP 属性访问和美元符号
【发布时间】:2013-03-12 16:33:15
【问题描述】:

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

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

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

class myClass {

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

}

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

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

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

编辑

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

class SethensClass {

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

}

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

【问题讨论】:

  • 有趣...一个赞成票和一个关闭请求。
  • 抱歉在这里评论your other question(如果作为一系列个人问题被问到,我个人认为会很好 - 参见例如stackoverflow.com/questions/15270843/…),但要说“最佳实践”说要这样做”有点没有意义。如果您无法解释为什么您认为某事是“最佳实践”,那么您怎么知道它是“最佳”?不同的事情在不同的情况下是最好的。
  • @PaulD.Waite 没关系。作为一名试图推进他的开发的开发人员,在我看来,询问某个特定库是否遵循最佳实践来帮助他们学习的问题是可以接受的。对于整个社区来说,不支持这是非常令人沮丧的。我不相信特定的库是使用最佳实践编写的,我正在努力确保它没有做错,所以当我贡献代码时,我可以确定它是最好的。
  • 酷酷。请记住,要使您的代码达到最佳状态,您需要超越“有人说这是最佳实践”,并理解为什么某些东西被认为是好的或最佳实践。

标签: php


【解决方案1】:

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;

【讨论】:

  • $myClass 应该代表$myClass = new myClass。
  • 那你就没有意义了。 $staticProp 是类变量,不是实例变量,因此不能被类实例调用。
  • @LimH。所以,你的意思是你不能用类实例访问static 变量??
  • @SethenMaleno 我对我的无知感到非常抱歉。显然,根据文档,从 PHP 5.3.0 开始,您可以从变量中引用该类。所以从技术上讲,您不能在实例上调用类变量,但因为 PHP 是 PHP,它会自动为您引用该类。因此,在您的情况下,$myClass 将被解释为 SethensClass,而不是实际的类实例,因此可以调用静态变量。
  • @SethenMaleno 你在那里的东西会起作用。除非绝对必要,否则我通常会避免这种行为,但它是合法的,有时也很有用
【解决方案2】:

它很贪心!

有时在基类中引用函数和变量或在还没有任何实例的类中引用函数很有用。 :: 运算符用于此目的。

<?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 中的原始定义被遮蔽并且不再可用,除非您使用 ::-operator 专门引用类 A 中 example() 的实现。编写 A::example() 来执行此操作(实际上,您应该编写 parent::example())。

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

【讨论】:

    猜你喜欢
    • 2011-01-06
    • 2023-02-21
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2011-11-08
    • 2016-10-31
    相关资源
    最近更新 更多