好吧所以我认为这可能是非常基本的,但它让我感到难过。在我回答我的问题之前,让我演示一下我的问题基于这个工作示例的概念:
<?php
$a = 'Stack';
$b = $a.' Overflow';
echo $b; // Result: "Stack Overflow"
?>
在上面的示例中,$b
被定义为$a
和' Overflow'
的组合。
现在,让我们假设我想做与上面相同的事情,除了我不想使用全局变量。我想使用课程。这就是我试图实现这一目标的方式:
<?php
class ClassName {
public $a = 'Stack';
public $b = $this->a.' Overflow'; // This gives me: "Parse error: syntax error, unexpected '$this'"
}
$instantiate = new ClassName;
echo $instantiate->$b; // Desired result: "Stack Overflow"
?>
如上所述,此尝试会导致错误。对我来说,这种尝试似乎是合乎逻辑的,但我想PHP并不这么认为。
问题:这是否可行,如果可行,我该如何实现预期效果呢?此外,如果你能解释为什么我的尝试失败(逻辑上),那将是一个奖励。
我已经搜索和研究了几个小时,试图找到答案或自己解决这个问题,但对于我的生活,我找不到任何人或任何甚至触及此事的东西(包括其他Stack)溢出线程)。我甚至无法在任何地方发现它不可能或任何类似的东西。
我是一名PHP新手,所以我可能需要比其他人更多的解释,但是我们非常感谢任何形式的帮助或一般指导。谢谢。
答案 0 :(得分:4)
在定义类时不能使用$ this,因为它引用了在实例化后变为可用的具体对象上下文。你可以使用构造函数来处理那些东西。
$this
答案 1 :(得分:2)
从PHP Docs about defining class properties
引用通过使用public,protected或private之一,然后是普通变量声明来定义它们。此声明可能包括初始化,但此初始化必须是常量值 - 也就是说,必须能够在编译时进行评估,并且不得依赖于运行 - 时间信息,以便进行评估。
(我的重点)
无法在编译时仅在运行时评估连接。
如果需要这样做,请在构造函数
中定义属性的初始值答案 2 :(得分:0)
这会引发语法错误,因为您在allowed的范围内使用int
:
当从对象上下文中调用该方法时,伪变量$ this在任何类方法中都可用。 $ this是对调用对象的引用(通常是方法所属的对象,但如果从辅助对象的上下文中静态调用该方法,则可能是另一个对象)。
这意味着,即使您希望由于此类限制,您也无法做您想做的事情。这是许多编程语言中的常见限制,必须将属性初始化为静态值。要解决您的问题,您可以执行以下任何操作:
同样的限制适用于静态类属性。