PHP专用静态功能

时间:2014-10-09 12:22:48

标签: php static-methods static-functions

我是一名初级PHP程序员。我还有很多东西需要学习。这就是我问这个问题的原因。在一个类中,你有一个公共函数,你可以从该类之外调用它。有时您有一个私有函数,您可以在私有函数所在的类中调用多次,以实现可重用的目的。我喜欢将private函数设置为static,我用以下函数调用该函数:

self::privateFunctionName();

通过使用 self ,它提醒我这个私有函数驻留在该类中。如果我对非静态函数使用 $ this-> privateFunctionName(),它可能位于超类/基类或该子类本身。这就是我喜欢使用静态私有函数的原因。从专业角度来看,使用静态私有函数而不是非静态函数是一个好主意吗?像你这样的专业程序员是否倾向于避免使用静态函数?

3 个答案:

答案 0 :(得分:3)

仅使用self::...并不意味着该方法是静态的。 parent::self::也适用于非静态方法。您可以在PHP manual - Scope Resolution Operator (::)中找到此内容,并在答案末尾添加一些示例代码摘录。

您可能想要阅读此前一个问题的所有答案:

总的来说,你会得到更多细节,然后是我在这个答案中的简短说明。

您可能会被那些使用的范围解析运算符::弄糊涂了。我有一个类似的理解问题。

但是,出于这种有限的原因,不要只选择使用静态方法。这些静态类方法只应在非常有限和狭窄的情况下使用。根据经验:

  

“不要使用静态类方法。”

如果您想从面向对象编程开始,只需使用普通对象方法。

以下excerpt from existing code表明self::以及parent::与标准(非静态)方法一起使用:

<?php

...

/**
 * Class XMLElementIterator
 *
 * Iterate over XMLReader element nodes
 */
class XMLElementIterator extends XMLReaderIterator
{
    private $index;
    private $name;
    private $didRewind;

    /**
     * @param XMLReader   $reader
     * @param null|string $name element name, leave empty or use '*' for all elements
     */
    public function __construct(XMLReader $reader, $name = null)
    {
        parent::__construct($reader);
        $this->setName($name);
    }

    /**
     * @return void
     */
    public function rewind()
    {
        parent::rewind();
        $this->ensureCurrentElementState();
        $this->didRewind = true;
        $this->index     = 0;
    }

    /**
     * @return XMLReaderNode|null
     */
    public function current()
    {
        $this->didRewind || self::rewind();

        $this->ensureCurrentElementState();

        return self::valid() ? new XMLReaderNode($this->reader) : null;
    }

    ...

答案 1 :(得分:1)

self::实际上并不意味着该方法是同一个类的一部分,它也可能是从父类继承的!

您不应该使用静态方法调用的语义来区分“内部”和“外部”方法。无论如何,它都没有真正的意义,你只是滥用语言功能而不是它们不适合的东西。也许这是一个主要的教训:不要试图发明使用语言功能的聪明的新方法。只是不要。

您应该将方法视为小的自包含黑匣子。你不需要知道也不想知道他们做了什么。您所知道的是,当您使用参数foo调用方法$bar时, x 将会发生,或者它将返回 y 。你不关心 这是怎么发生的,只是它确实发生了,因为这就是方法应该做的事情。

因此,static和非静态方法传达了不同的用途,具有不同的限制。当您没有对象时,应该调用static个方法,例如作为替代构造方法(例如DateTime::createFromFormat)。

此外,将方法限制为static意味着它无法访问对象实例数据,这可能会在将来限制您。随着项目的发展,您可能会发现您的方法现在需要考虑对象中的一些其他数据来完成其工作。如果从一开始就将它声明为非静态,那么只需对方法本身进行一些修改即可;对外界来说,它仍然以同样的方式完成工作(输入→输出)。但是,如果您将其声明为static并突然发现自己需要将其设置为非静态,则必须更改代码而不仅仅是一种方法。

结论:如果您的方法不应公开公开,因为除了您自己的课程之外,没有人可以调用它,请将其设为private。如果该方法需要static,因为必须在没有对象上下文的情况下工作,请将其设为static。如果它满足两个要求,请将其private static。否则,不要。

答案 2 :(得分:0)

基本上,“私有静态”函数是一个完全无意义的构造,因为它不能从外部调用。

$ this-&gt;之间没有真正的区别并且使用self ::期望它可以在没有对象的情况下从外部调用,并且无论在该函数所在的命名空间/类中,它都可以为CPU调用该函数执行相同的工作量。

然而,私有函数只能在同一个类中调用,你总是有一个对象,而“静态”修饰符在这里有点过分,因为它没有区别。

在这种情况下,我总是喜欢说:做你喜欢的只是你个人风格的事情,但不要切换到周围,保持这种方式来开发和使用你觉得舒服的标准。

在某些情况下,只有“另一种”方式,并且根本不存在“专业”方式。 这种趋势常常会使一种或另一种方法随着时间的推移变得流行。