我只是试图获取函数something
,但我只是不断收到错误
未捕获错误:类名必须是有效对象或字符串
任何想法?
class A {
private $a;
private $b;
function __construct($a,$b){
$this->a = ( $a == NULL) ? ' something' : $a;
$this->b = ( $b == NULL) ? ' something' : $b;
echo($this->a);
}
private function geta(){
return $this->a;
}
private function getb(){
return $this->b;
}
public static function something(){
echo $this->a;
echo $this->b;
}
}
$o = new A('hi','something');
$o->A::something();
答案 0 :(得分:6)
$o::something();
您不需要引用A
,因为$o
已经class A
,因此您可以直接调用静态函数something()
但您在$this
内使用static function
,这是不可能的!
因此您需要删除该功能的static
类型,因为在该功能中您无法使用$this
所以你需要做到这一点:
public function something(){
echo $this->a;
echo $this->b;
}
并以这种方式调用它:
$o = new A('hi','something');
$o->something();
答案 1 :(得分:1)
您正在使用的语法不会像您认为的那样分解。
您可能会认为它会执行以下操作:〈$o->〈A::something〉〉()
(意思是:使用静态函数A::something
并将其应用于$o
。但实际上它的评估结果如下:{{1} }(意思是:它使用〈〈$o->A〉::something〉()
作为类来调用静态
函数$o->A
on。)
具体做法是:
something
将从对象$o->A
中读取字段(实例变量)A
。由于类$o
的对象中没有A
字段,因此您将获得null。
语法A
(在您的情况下$var::func()
为$var
)将尝试在$o->A
中找到由字符串命名的类,并调用静态方法{{ 1}}就可以了(或者,如果$var
是一个对象,它将使用实例的类)。由于func
在您的情况下为空,因此您会收到错误$o
。
我认为你的意思是没有$var
是静态的(因为它使用Uncaught Error: Class name must be a valid object or a string
,这在静态上下文中是无效的):
something
答案 2 :(得分:0)
因为Class A
被调用并设置为变量$o
,如果您使用$o->something()
来调用something()
的{{1}}
但是在您的代码中,我看到函数class A
是something()
,您无法在static function
中使用$this
来调用non-static variable
,如果你需要使用静态函数,可以参考这个例子:
static function
如果你不需要静态函数,你可以删除函数class A {
private static $a;
private static $b;
function __construct($a,$b){
static::$a = ( $a == NULL) ? ' something' : $a;
static::$b = ( $b == NULL) ? ' something' : $b;
echo(static::$a);
}
private function geta(){
return static::$a;
}
private function getb(){
return static::$b;
}
public static function something(){
echo self::$a;
echo self::$b;
}
}
$o = new A('hi','something');
$o->something();
的静态函数,并使用something()
来调用非静态函数。