代码之家  ›  专栏  ›  技术社区  ›  Emanuil Rusev

下划线方法前缀

  •  5
  • Emanuil Rusev  · 技术社区  · 16 年前

    我一直在检查CodeIgniter和CakePHP的代码,我注意到它们类中的一些方法的前缀是下划线 _ __ .

    7 回复  |  直到 14 年前
        1
  •  12
  •   Gordon Haim Evgi    16 年前

    PHP's magic methods ,表示 Visibility 缺少适当的可见性关键字:

    Cake Coding Conventions:

    由于我们不能将PHP5的私有关键字和受保护关键字用于方法或变量,因此我们同意以下规则:

    • 私有方法或变量名以双下划线(“\”)开头。

    CodeIgniter conventions :

    只能由类内部访问的方法和变量(例如公共方法用于代码抽象的实用程序和帮助程序函数)应以下划线作为前缀。

        2
  •  1
  •   Felix Kling    16 年前

    这些是 Magic Methods 在PHP类中:

    函数名 __construct, __destruct, __call, __callStatic, __get, __set, __isset, __unset, __sleep, __wakeup, __toString, __invoke, __set_state __clone 在PHP类中是神奇的。在任何类中都不能有具有这些名称的函数,除非需要与它们关联的神奇功能。

    一种方法 下划线没有特殊含义。这更有可能是项目的某种编码约定。

        3
  •  1
  •   Pekka    16 年前

    magic methods

    PHP保留 __

    两个框架似乎都使用了 __ 前缀也有自己的用途。见@Gordon的答案。

        4
  •  1
  •   mattsg    13 年前

    在Codeigniter中,控制器中的方法通常可以作为url的一部分调用,因此您可以在控制器“main”中调用方法“index”,如下所示:

    您的控制器中可能还有一个方法,您不希望有人能够作为url中的一个段来调用该方法,因此您可以在其前面加一个“3;”(单下划线)。。这和保密不同。私有方法只能在定义它的类中调用。因此,控制器方法的前缀可以是下划线,这将使它不能作为url段调用,也可以声明为private,这将使它不能从其他类调用。

        5
  •  0
  •   Bouke    16 年前

    protected private 对于非CakePHP类。他们可能是 public 因为它们可以从其他类调用,进行某种黑客攻击。请注意 __get __construct PHP中还存在其他神奇的方法(如上所述)。

        6
  •  0
  •   Nik    16 年前

    以\开头的方法是在php中自动调用的神奇方法。 更多参考,请检查,

    http://php.net/manual/en/language.oop5.magic.php

        7
  •  0
  •   mopsyd    8 年前

    我有一个我自己喜欢的用例。我经常会写一些特性来支持一个特定的接口,尽管由于traits不能直接实现一个接口,我会在doc block注释中指定trait满足的接口,并用一个下划线指定与接口无关的前缀保护和私有方法。这使您可以很容易地了解提供了哪些方法来满足契约(接口),哪些是支持方法。如:

    interface Foo {
        public function bar(array $args = null, array $flags = null);
    }
    

    以下特性的目的是满足 Foo

    /**
     * @satifies Foo
     */
    trait FooTrait {
    
        public function bar(array $args = null, array $flags = null) {
            $this->_handleArgs($args);
            $this->_handleFlags($flags);
        }
    
        protected function _handleArgs(array $args = null) {
            if (is_null($args) {
                return;
            }
            //do something with the args
        }
    
        protected function _handleFlags(array $flags = null) {
            if (is_null($flags) {
                return;
            }
            //do something with the flags
        }
    }
    

    final class ConcreteFoo implements Foo {
        use FooTrait;
    }
    

    这使事物保持非常松散的耦合,并使之能够非常容易地与其他库或框架中的其他类集成,这些库或框架确实需要一系列继承,而不必将逻辑与一堆适配器类纠缠在一起。


    我的IDE(Netbeans)抱怨这违反了PSR-1。由于PSR-1不会直接影响执行,而且这是否是一种可读性更好的方法也是有争议的,所以我真的不太在乎。不过,我确实尝试遵循所有直接影响执行的PSR。

    推荐文章