未捕获错误:类名必须是有效对象或字符串

时间:2018-03-27 07:18:17

标签: php oop

我只是试图获取函数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();

3 个答案:

答案 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 Asomething(),您无法在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()来调用非静态函数。

希望能帮到你!对不起我的英语不好。 :d