首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >访问静态函数中的公共/私有函数?

访问静态函数中的公共/私有函数?
EN

Stack Overflow用户
提问于 2013-05-07 20:59:59
回答 3查看 12.3K关注 0票数 8

由于您可以而不是使用$this->在静态functio中,如何访问静态函数中的常规函数?

代码语言:javascript
复制
private function hey()
{
    return 'hello';
}

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

这会引发一个错误,因为不能在静态中使用$ This ->。

代码语言:javascript
复制
private function hey()
{
    return 'hello';
}

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

这会引发以下错误:

代码语言:javascript
复制
Non-static method Vote::get() should not be called statically

如何访问静态方法中的常规方法?在同一个类中*

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-07 21:11:33

静态方法只能调用类中的其他静态方法。如果要访问非静态成员,则方法本身必须是非静态的.

或者,您可以将对象实例传入静态方法并访问其成员。由于静态方法是在与您感兴趣的静态成员相同的类中声明的,因此它仍然应该工作,因为在PHP中可见性是如何工作的

代码语言:javascript
复制
class Foo {

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

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

但是请注意,仅仅因为你能做到这一点,你是否应该这样做是值得怀疑的。这种代码破坏了良好的面向对象编程实践。

票数 7
EN

Stack Overflow用户

发布于 2013-05-07 21:09:03

您可以提供对静态方法的实例的引用:

代码语言:javascript
复制
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此选项)。

票数 7
EN

Stack Overflow用户

发布于 2021-07-22 07:29:51

我通过在静态方法中创建有关类的对象来解决这个问题。通过这种方式,我也可以将一些特定的公共函数公开为静态函数。其他公共功能只能像$object->public_function();那样使用。

一个小代码示例:

代码语言:javascript
复制
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();这样的令牌对象,这样我就可以使用$manager->createToken();$manager->updateToken(updateObjectHere);$manager->storeToken();等功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16428457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档