由于您可以不使用$ this->在静态函数中,你应该如何访问静态函数中的常规函数?
private function hey()
{
return 'hello';
}
public final static function get()
{
return $this->hey();
}
这会引发错误,因为您无法使用$ this->在静态内部。
private function hey()
{
return 'hello';
}
public final static function get()
{
return self::hey();
}
这会引发以下错误:
Non-static method Vote::get() should not be called statically
如何在静态方法中访问常规方法?在同一个班级*
答案 0 :(得分: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 pattern(evaluate此选项)。
答案 1 :(得分:4)
静态方法只能调用类中的其他静态方法。如果要访问非静态成员,则方法本身必须是非静态的。
或者,您可以将对象实例传入静态方法并访问其成员。由于静态方法在与您感兴趣的静态成员相同的类中声明,因此它仍然可以工作,因为PHP中的可见性如何工作
class Foo {
private function bar () {
return get_class ($this);
}
static public function baz (Foo $quux) {
return $quux -> bar ();
}
}
请注意,只是因为你可以做到这一点,你是否应该这是值得怀疑的。这种代码打破了良好的面向对象编程实践。
答案 2 :(得分:0)
我通过在静态方法中创建相关类的对象来解决这个问题。这样我也可以将一些特定的公共函数公开为静态函数。其他公共函数只能像 $object->public_function();
一个小代码示例:
class Person
{
public static function sayHi()
{
return (new Person())->saySomething("hi");
}
public function saySomething($text)
{
echo($text);
}
private function smile()
{
# dome some smile logic
}
}
这样你只能在使用静态函数时说hi
,但在创建像$peter->saySomething('hi');
这样的对象时你也可以说其他的东西。
公共函数也可以这样使用私有函数。
请注意,我不确定这是否是最佳实践,但它适用于我希望能够生成令牌而无需每次都手动创建对象的情况。
例如,我可以简单地发布或验证像 TokenManager::getTokenToken();
或 TokenManager::verifyToken("TokenHere");
这样的令牌字符串,但我也可以发布像 $manager = new TokenGenerator();
这样的令牌对象,这样我就可以使用 {{1} }、$manager->createToken();
或 $manager->updateToken(updateObjectHere);