在静态函数中使用$ this失败


77

我有想要在其中使用$ this的方法,但我得到的是:致命错误:不在对象上下文中时使用$ this。

我怎样才能使它工作?

public static function userNameAvailibility()
{
     $result = $this->getsomthin();
}

Answers:


136

这是正确的方法

public static function userNameAvailibility()
{
     $result = self::getsomthin();
}

使用self::,而不是$this->用于静态方法

有关更多信息,请参见:PHP静态方法教程:)


1
是的,我正要发布此答案。
Gaurav Sharma

13
您还应该记住,getsomthin()方法也必须是静态的-您不能在静态方法内部调用非静态方法。
thorinkor

7
@Sarfraz,static::不是self::吗?
Pacerier

在C / C ++中,有什么方法可以做类似的事情吗?
thnkwthprtls 2013年

14

您不能$this在静态函数内部使用,因为静态函数独立于任何实例化对象。尝试使函数不是静态的。

编辑:根据定义,可以在没有任何实例化对象的情况下调用静态方法,因此$this在静态方法内部没有任何有意义的使用。


2
当您尝试将静态变量分配给实例变量时,应该存在。这不是可能的吗?

5

使用self ::只能在静态函数内调用静态函数:如果您的类包含要使用的非静态函数,则可以声明相同类的实例并使用它。

<?php
class some_class{
function nonStatic() {
    //.....  Some code ....   
    }
 Static function isStatic(){
    $someClassObject = new some_class;
    $someClassObject->nonStatic();
    } 
}
?>

3

访问器this引用该类的当前实例。由于静态方法无法在实例中运行,this因此禁止使用。因此,需要在此处直接调用该方法。静态方法无法访问实例范围内的任何内容,但可以访问实例范围之外的类范围内的所有内容。



1

这是一个错误地调用类方法的示例。执行此代码时,您会看到一些警告,但是它将起作用并打印:“我是A:正在打印B属性”。(在php5.6中执行)

class A {
    public function aMethod() {
        echo "I'm A: ";
        echo "printing " . $this->property;
    }
}

class B {
    public $property = "B property";

    public function bMethod() {
        A::aMethod();
    }
}

$b = new B();
$b->bMethod();

它接缝的是,在称为静态方法的方法中使用的变量$ this指向“调用者”类的实例。在上面的示例中,在A类中使用了$ this-> property,它指向B的属性。

编辑:

从对象上下文中调用方法时,伪变量$ this可用。$ this是对调用对象的引用(通常是该方法所属的对象,但如果从辅助对象的上下文中静态调用该方法,则可能是另一个对象)。 PHP>基础


1

在静态方法中,属性用于类,而不是对象。这就是为什么无需创建对象就可以访问静态方法或功能的原因。$ this指的是由类组成的对象,但是$ self仅指相同的类。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.