Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP静态方法与非静态方法/标准函数_Php_Oop - Fatal编程技术网

PHP静态方法与非静态方法/标准函数

PHP静态方法与非静态方法/标准函数,php,oop,Php,Oop,我正在开发一个web应用程序,第一次编写纯面向对象的PHP。我有一个关于静态方法和标准函数的问题: 下面是一个示例场景: class Session { public function start_new_session() { session_start(); //other code here like token generator } } VS class Session { static function start_n

我正在开发一个web应用程序,第一次编写纯面向对象的PHP。我有一个关于静态方法和标准函数的问题:

下面是一个示例场景:

class Session
{
    public function start_new_session()
    {
        session_start();
        //other code here like token generator
    }
}
VS

class Session
{
    static function start_new_session()
    {
        session_start();
        //other code here like token generator
    }
}
问题

  • 两者的区别是什么
  • 哪一个更适合我的情况
  • 有申请吗?(我的意思是,使用静态方法和标准函数的最佳方案是什么)
  • 我的研究:

    我花了一些时间寻找答案,但没有找到相关的答案,但我发现了很多辩论和有用的材料。相信我,对于像我这样的初学者来说,很难决定(谁是对的/错的?)

  • 有人说,在静态函数中使用cookie是一个可怕的想法,有人说这是一个伟大的想法

  • 而且:每个人都在争论性能,一些专家说,静态函数执行得更快,一些人说;功能更快。由于php的版本不同,结果也会有所不同

  • 一些有用的统计信息:

    PHP5.2:静态方法快约10-15%

    PHP5.3:非静态方法快约15%

    PHP5.4:静态方法快约10-15%


    PHP5.5:静态方法调用非静态方法快约20%

    您需要实例化类(使用
    new
    关键字创建类的新实例)

    调用静态方法时,您不必“新建”,但它不能直接访问任何非静态属性或方法。有几十个用例/场景,您可能希望使用其中一个而不是另一个

    老实说,我从来没有想过使用其中一个而不是另一个的性能。如果它达到了一个显著的程度(并且已经采取了所有主要步骤来提高效率),那么我可以想象这样一个大型应用程序的维护成本将超过提高效率的需要,或者应用程序背后的逻辑从一开始就存在相当大的缺陷


    静态和非静态示例

    如果我打算在您的问题中使用一个类,那么我将使用静态版本,因为该方法中的任何内容都不依赖于该类的其他属性,并且您不必实例化它:

    Session::start_new_session()
    
    vs

    此外,类上的静态属性将记住在使用非静态属性和实例化时会丢失的状态:

    class Session
    {
        protected static $sessionStarted = false;
    
        static function start_new_session()
        {
            if (!static::$sessionStarted) {
                session_start();
                static::$sessionStarted = true;
            }
        }
    }
    
    即使你做到了:

    $session = new Session();
    
    $hasStated = $session::sessionStarted;
    
    $hasStarted
    仍然是
    true

    你甚至可以这样做:

    class Session
    {
        protected static $sessionStarted = false;
    
        public function __construct()
        {
            $this->startIfNotStarted();
        }
    
        function startIfNotStarted()
        {
            if (!static::$sessionStarted) {
    
                session_start();
    
                static::$sessionStarted = true;
            }
        }
    }
    
    这样,您就不必担心自己启动会话,因为它将在实例化类时启动,并且只会发生一次

    如果您有一个类似于
    Person
    的类,那么这种方法就不合适了,因为每次数据都会不同,并且您不希望在不同的实例化中使用相同的数据

    class Person
    {
        protected $firstname;
    
        protected $lastname;
    
        public function __construct($firstname, $lastname)
        {
            $this->firstname = $firstname;
            $this->lastname = $lastname;
        }
    
        public function getFullname()
        {
            return "{$this->firstname} {$this->lastname}";
        }
    }
    
    //

    如果要对此类使用静态方法/属性,则只能有一个人

    class Person
    {
        protected static $firstname;
    
        protected static $lastname;
    
        static function setName($firstname, $lastname)
        {
            static::$firstname = $firstname;
            static::$lastname = $lastname;
        }
    
        static function getFullname()
        {
            return static::$firstname . ' ' . static::$lastname;
        }
    }
    
    //


    辩论

    对于PHP,您可能会看到很多关于哪个更好以及最佳实践是什么的争论(不仅仅是关于静态和非静态方法)

    不过我不会被它困住的!如果你发现其中一个方面对你更有意义(无论你当时在建什么),那么就选择那一个。在这个社区里,标准和观点一直在变化,而5年前(甚至更少)是一个问题的东西中,有一半在今天实际上将不再是问题

    Laravel
    框架为例——其中一个(许多)争论是,外观不好,因为它们是静态的,并且使用了难以测试和调试的神奇方法。Facades实际上非常容易测试,使用堆栈跟踪错误报告,调试一点也不困难

    也就是说,如果你发现大多数人都在说同样的话,而另一方却没有真正的争论,那么这可能是有原因的,例如不使用
    mysql\uuu
    函数或不在循环中运行查询


    希望这有帮助

    更快?基于什么基准?如何调整紧耦合的存在?基于这个罗斯,你是老板!我很不高兴,因为我的问题没有提供任何正当理由就被否决了。但我很高兴,你回答得如此出色。非常感谢!!!:)另一个问题,假设我使用
    database\u insert
    方法创建一个类;它获取一些数据并插入到数据库中。静态法适合吗?静态类一次只能保存一个值。对吗?@Alena我完全取决于你的实施。就我个人而言,我处理这类事情的方法是,最初总是使用非静态方法,然后只有在必要/合理的情况下才将它们设置为静态。如果您考虑的是一个数据库类,那么我还将研究
    Singleton
    。此外,也可以考虑可靠的原则,但是请将可靠视为更多的一个原则,在你可以的时候,大部分时间都这样做是好的,而不是必须一直这样做。
    $person1 = new Person('John', 'Smith');
    $person2 = new Person('Jane', 'Foster');
    
    $person1->fullname(); // John Smith
    $person2->fullname(); // Jane Foster
    
    class Person
    {
        protected static $firstname;
    
        protected static $lastname;
    
        static function setName($firstname, $lastname)
        {
            static::$firstname = $firstname;
            static::$lastname = $lastname;
        }
    
        static function getFullname()
        {
            return static::$firstname . ' ' . static::$lastname;
        }
    }
    
    Person::setName('John', 'Smith');
    Person::setName('Jane', 'Foster');
    
    Person::getFullname(); //Jane Foster