3

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

self::privateFunctionName();

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

4

3 回答 3

3

只使用self::...不能意味着方法是静态的。parent::并且self::适用于非静态方法。您可以在PHP 手册 - 范围解析运算符 (::)中找到它,我在答案末尾添加了一些示例性代码摘录。

您可能想通读这个早期问题的所有答案:

总的来说,您将获得更多详细信息,然后是我在此答案中的简短描述。

您可能对::那些使用的范围解析运算符感到困惑。我在理解这一点时遇到了类似的理解问题。

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

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

如果您喜欢从面向对象编程开始,只需使用普通的对象方法即可。

这是现有代码的摘录,显示了标准(非静态)方法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;
    }

    ...
于 2014-10-09T13:12:10.833 回答
1

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

您不应使用静态方法调用的语义来区分“内部”和“外部”方法。无论如何,这没有任何意义,而且您只是在滥用语言功能来实现它们不应该用于的东西。也许让这成为一个主要的教训:不要试图发明聪明的新方法来使用语言特性。只是不要。

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

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

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

底线:如果你的方法不应该公开公开,因为除了你自己的类之外没有人可以调用它,那么 make it private。如果该方法需要是static因为它必须在没有对象上下文的情况下工作,请使其static. 如果它满足这两个要求,请制作它private static。否则,不要。

于 2014-10-09T12:58:51.523 回答
0

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

$this-> 和 using self:: 之间没有真正的区别,期望它可以在没有对象的情况下从外部调用,并且 CPU 调用函数的工作量相同,无论在哪个命名空间/这个函数所在的类。

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

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

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

于 2014-10-09T12:34:29.840 回答