2013-05-07 157 views
2

由于你可以用而不是使用$ this->在一个静态函数中,你应该如何访问静态内部的常规函数​​?访问一个静态函数内的公共/私人函数?

private function hey() 
{ 
    return 'hello'; 
} 

public final static function get() 
{ 
    return $this->hey(); 
} 

此抛出一个错误,因为你不能使用$这 - >内静态。

private function hey() 
{ 
    return 'hello'; 
} 

public final static function get() 
{ 
    return self::hey(); 
} 

这引发以下错误:

Non-static method Vote::get() should not be called statically 

你怎么能访问静态方法中常用数据处理方法?在同一类*

+0

如果要调用它们,则必须将不会访问'$ this'的函数更改为静态函数。 – 2013-05-07 21:01:11

+0

将类引用传递给您的静态方法。 – 2013-05-07 21:02:04

+0

我该怎么做?就像在hey()中那样,返回$ this-> get(“hello”)? – 2013-05-07 21:04:17

回答

3

静态方法只能调用类中的其他静态方法。如果你想访问一个非静态成员,那么该方法本身必须是非静态的。

或者,您可以将对象实例传入静态方法并访问其成员。由于静态方法是在同一个类中声明你感兴趣的静态成员,应该还是因为知名度如何在PHP

class Foo { 

    private function bar() { 
     return get_class ($this); 
    } 

    static public function baz (Foo $quux) { 
     return $quux -> bar(); 
    } 
} 

做不过请注意,只是因为你可以做到这一点的工作,你是否应该这样做是值得怀疑的。这种代码打破了良好的面向对象的编程习惯。

+0

非常感谢!现在我明白了... – 2013-05-07 21:27:06

6

您可以提供一个参考的实例,以静态方法:

class My { 
    protected myProtected() { 
     // do something 
    } 

    public myPublic() { 
     // do something 
    } 

    public static myStatic(My $obj) { 
     $obj->myProtected(); // can access protected/private members 
     $obj->myPublic(); 
    } 

} 

$something = new My; 

// A static method call: 
My::myStatic($something); 

// A member function call: 
$something->myPublic(); 

如上所示,静态方法可以访问对象私有和保护构件(属性和方法)他们是其中的一员。

或者,如果您只需要一个实例,则可以使用singleton patternevaluate此选项)。