gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:34:53 25 4
gpt4 key购买 nike

我正在开发一个 Web 应用程序并第一次编写基于纯 OOP 的 PHP。我有一个关于静态方法VS标准函数的问题:

这是一个示例场景:

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
}
}

问题
  • 两者有什么区别?
  • 哪个更适合我的情况?
  • 有什么应用吗? (我的意思是,使用静态方法和标准函数的最佳场景是什么)

  • 我的研究:

    我花了一些时间来寻找答案,但没有找到相关的答案,但是我发现了很多辩论和有用的 Material 。相信我,对于像我这样的初学者来说,很难决定(谁对谁错?):
  • In this question有人说,在静态函数中使用 cookie 的想法很糟糕有人说这是个好主意
  • in this question : 大家都在讨论性能问题,有的专家说,静态函数执行速度快,有的说;功能更快。并且结果也因 php 版本的不同而有所不同。

  • 一些有用的统计信息:

    PHP 5.2 :静态方法的速度提高了大约 10-15%。

    PHP 5.3 : 非静态方法快 15%

    PHP 5.4 : 静态方法快 10-15%

    PHP 5.5 : 静态方法快 20%

    最佳答案

    要调用非静态方法,您需要实例化类(使用 new 关键字来创建类的新实例)。

    调用静态方法时,您不必“对其进行更新”,但它无法直接访问任何非静态属性或方法。有许多用例/场景,您可能希望使用其中一个。

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

    静态和非静态示例

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

    Session::start_new_session()

    对比
    $session = new Session();

    $session->start_new_session();

    此外,类上的静态属性将记住如果您使用非静态属性和实例化可能会丢失的状态:
    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;
    }
    }
    }

    这样您就不必担心自己启动 session ,因为它会在您实例化类时启动,并且只会发生一次。

    如果您有类似 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}";
    }
    }

    //
    $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

    辩论

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

    不过,我不会陷入困境!如果你发现一侧对你更有意义(以及你当时 build 的任何东西),那就选择那一侧。在这个社区中,标准和意见一直在变化,5 年前(甚至更少)存在的问题的一半在今天实际上已不再是问题。

    Laravel以框架为例——(许多)争论之一是外观不好,因为它们是静态的,并且使用了难以测试和调试的魔术方法。 Facades 实际上很容易测试,并且通过使用堆栈跟踪错误报告,调试根本不难。

    话虽如此,如果你发现大多数人都在说同样的话,而另一方并没有真正进行辩论,那么可能是有原因的,例如不要使用 mysql_函数或不在循环内运行查询。

    希望这可以帮助!

    关于PHP 静态方法与非静态方法/标准函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45109062/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com