【问题标题】:PHP is it okay to use (new self) often to access public methods within the static methodPHP是否可以经常使用(新自我)访问静态方法中的公共方法
【发布时间】:2020-09-19 09:09:34
【问题描述】:

通过遵循 OOP 方法,我将可重用的方法编写到特征中,而不是创建一个普通的帮助文件。这样我就可以有组织地控制访问。为此,我创建了各种traits,例如permissionsauthsettingshelpers 等。

使用 PHP 七年多了,我还是觉得有 很多东西要学。

大多数特征都有私有和静态方法。但是,helpers 特征具有所有公共方法。要将 helpers 特征中的任何方法调用到其他特征的 static 方法,我必须使用 (new self)->helper_method() 调用它

问题:

我想知道经常使用它有什么缺点吗?如果 是的,有没有比它更好的方法来访问其中的公共方法 静态方法?

示例代码

这是我正在尝试做的一个例子。

权限特征

trait permissions {


    private static function authorize() {
        $role = ( new self() )->checkUserRole();

        if ( $role == 'ultimate' ) {
            return TRUE;
        }

        return FALSE;
    }

}

身份验证特征

特征认证{

public function checkUserRole( $userId = FALSE ) {
    $user = $userId ? getUser( $userId ) : getCurrentUser();

    if ( $user ) {
        return $user->role;
    }

    return FALSE;
}

}

UltimatePost 类

class UltimatePost {
    use permissions, auth, ...;

    public function __construct() {
        if ( ! self::authorize() ) {
            return FALSE;
        }
    }
}

UltimateMedia 类

class UltimateMedia {
    use permissions, auth, ...;

    public function __construct() {
        if ( ! self::authorize() ) {
            return FALSE;
        }
    }
}

【问题讨论】:

  • 能否请您展示一个您尝试过的简短示例,它可以帮助展示您是如何做的,有时可以帮助其他人更好地了解正在发生的事情。
  • @NigelRen 我已经用一些示例代码更新了我的问题。

标签: php traits static-methods public-method


【解决方案1】:

缺点是类的构造函数通常可能应该有 必需的参数。如果您的构造函数不带参数,并且实例显然是完全可以互换的,那么您为什么首先使用类而不是函数集合是值得怀疑的。

如果你的类需要构造函数参数,你不能随便实例化它们,因为你需要传递所需的参数,而你的静态方法可能没有。

在您的情况下,您的类最终只是以getCurrentUser 结尾的一堆静态函数调用,因此您似乎根本没有使用 OOP。

您可能对How Not To Kill Your Testability Using Statics 感兴趣,以深入了解该主题。

【讨论】:

  • 感谢并感谢详细的解释。我自己学习 PHP,您的反馈对我很有价值。正如我所提到的,还有很多东西要学,尤其是在 OOP 方面。您能否向我推荐任何可以让我获得更多 OOP 专业知识的最佳测试代码、工具或网站?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 2023-03-30
  • 2012-12-26
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
相关资源
最近更新 更多