Php 拆分大型类还是为单个函数调用完全加载它们?

Php 拆分大型类还是为单个函数调用完全加载它们?,php,class,oop,Php,Class,Oop,我想知道是否值得将一个大类分成不同的部分,并且只在需要时使用它们。如果是这样,最好的选择是什么 我不确定在启用缓存时,在PHP文件中使用大型类会对资源产生什么影响,因为大型类的使用非常有限。也许这不值得,不管班级有多大 我心目中有两个模型。。。这个变量需要能够影响“父”变量。我完全知道这段代码不起作用,我只是想用PHP+pseudo来解释它,而不仅仅是伪代码 class User { public $id; public $password; public $passwo

我想知道是否值得将一个大类分成不同的部分,并且只在需要时使用它们。如果是这样,最好的选择是什么

我不确定在启用缓存时,在PHP文件中使用大型类会对资源产生什么影响,因为大型类的使用非常有限。也许这不值得,不管班级有多大

我心目中有两个模型。。。这个变量需要能够影响“父”变量。我完全知道这段代码不起作用,我只是想用PHP+pseudo来解释它,而不仅仅是伪代码

class User {
    public $id;
    public $password;
    public $password_hash;
    public $post_count;

    public function __construct($id) {
        $this->id = $id;
    }
}

subclass Password of User {
    public function set($password) {
        parent::$password = $password; }
    public function generateHash() {
        parent::$password_hash = hash("sha256", parent::$password, true); }
    public function validate($password) {
        return (hash("sha256", $password, true) === parent::$password_hash); }
}

subclass Post of User {
    public function count() {
        $db = ConnectionFactory::getFactory()->getConnection();
        $sql = $db->prepare("SELECT 1 FROM `Forum_Posts` WHERE `User_ID`=:user");
        $sql->execute(array('user' => parent::$id));
        parent::$post_count = $sql->rowCount();
        return parent::$post_count;
    }
}

$some_bloke = new User(3);
$bob = new User(4);
$bob->Password->set('idonthaveaverygoodpassword');
$bob->Password->generateHash();
$lucy = new User(5);
echo $lucy->Post->count();
我也考虑过使用多个特性,但这不是一个很好的解决方案,我担心它会毫无意义地增加内存使用:

class User {
    use BaseUser;
}

class User_Password {
    use BaseUser;
    use Password;
}

class User_Post {
    use BaseUser;
    use Post;
}

trait BaseUser {
    public $id;
    public $password;
    public $password_hash;
    public $post_count;

    public function __construct($id) {
        $this->id = $id;
    }    
}

trait Password {
    //stuff
}

trait Post {
    //stuff
}

$some_bloke = new User(3);
$bob = new User_Password(4);
$bob->setPassword('idonthaveaverygoodpassword');
$bob->generatePasswordHash();
$lucy = new User(5);
echo $lucy->countPosts();

我也非常乐意接受关于如何重命名这篇文章的建议。我只是不太确定。

一个通用的框架,它可以帮助OOP独立于域,被称为。它可以通过尝试遵守它定义的每一个原则,一般地应用于任何领域。也就是说,SOLID只是一个框架,代码可以实现坚实的原则,但仍然很难使用:(我将尝试在您的领域中使用非常通用的it应用程序来回答这个问题:

单一责任 每个类是否只有一个更改的原因。如果哈希算法或salt更改,会将其隔离到一个点吗?是的。如果需求更改,组织不想跟踪内存中的原始密码,该怎么办?否。用户和密码都需要更改

打开/关闭 我们将如何创建新类型的帖子、用户或密码?如果企业希望添加一个未经验证的用户,而该用户不需要密码,该怎么办?是否可以在不修改用户模型的情况下在系统中对其建模?如果未经验证的用户始终拥有0篇帖子该怎么办

Liskov代换 这表明,所有对象都应可替换为其子类型的实例。这通常仅在创建使用域对象的代码后进行验证。在这种情况下:

$some_bloke = new User(3);
$bob = new User(4);
$bob->Password->set('idonthaveaverygoodpassword');
$bob->Password->generateHash();
$lucy = new User(5);
echo $lucy->Post->count();
如果
$bob
Post
的一个实例,那么它将无法使用
密码
进行实例化,密码是
用户
的子类,而
$lucy
密码
的一个实例,而不是
用户

接口隔离

依赖项倒置


一般来说,我觉得对于更高级别(非嵌入式)的应用程序来说,内存使用应该不是问题。我发现,即使对于移动应用程序,抽象和可维护性也比最小化内存使用更重要


此外,基于继承的层次结构很容易变得笨拙和脆弱可能有助于实现稳定并将脆弱性降至最低。可以为用户提供密码策略,该策略将定义生成密码的界面,并允许密码生成实现更改,并且不影响用户。希望生成密码的用户可以委托他们的特定策略。

谢谢!这是非常有见地。我严重地担心我永远不会得到答复。x_x也是指CPU使用率,我不知道为什么我说内存:p我想这归结为牺牲了可能微不足道的内存/CPU使用率(如果有的话),或者牺牲通过SOLID进行编码/编辑的便利性。您对用户在未登录的情况下进行发布提出了一个很好的观点;我希望一些用户操作可以在不需要登录的情况下执行,我只是从来没有想过基于继承的层次结构的后果。