【问题标题】:Yii - are most of functions in model files supposed to be static function?Yii - 模型文件中的大多数函数都应该是静态函数吗?
【发布时间】:2023-03-29 18:14:01
【问题描述】:

我是 Yii 框架用户。

大多数情况下,我在模型文件中将函数定义为公共静态函数,如下面的示例函数。

public static function getTrashedPostCount(){           
    $connection=Yii::app()->db;     
    $sql = "SELECT COUNT(publish_status)
                FROM {{post}}
                WHERE publish_status = 'trash'";              
    $command=$connection->createCommand($sql);
    $postCount = $command->queryScalar();
    return $postCount;      
}   

不知道是不是我做错了。

模型文件中的大部分函数都应该是静态函数吗?

如果我做错或理解错误,请告诉我。

谢谢!!!

【问题讨论】:

标签: php yii yii-cmodel


【解决方案1】:

是的,你做错了。

静态方法很容易调用,但有几个架构上的缺点,所以一般来说它们应该谨慎使用(或者更好的是:完全避免使用)。

在这种情况下,没有理由使用静态方法,尤其是编写自定义 SQL 的方法。使用 Yii 的named scopes 来实现同样的目标:

class Post extends CActiveRecord
{
    public function scopes()
    {
        return array(
            'trashed'=>array(
                'condition' => "publish_status = 'trash'",
            ),
        );
    }
}

然后:

$trashedCount = Post::model()->trashed()->count();

【讨论】:

  • 我不知道如何使用 Yii 的命名作用域。我查一下!!谢谢!!
  • 所以,我最好使用公共方法(或私有,受保护)而不是静态方法。我明白了。
  • @Hayato:如果不是static,并不是方法本身更好——问题是它迫使调用者编写“更糟糕”的代码。简单的例子:在$model->foo() 中,调用者不需要特别知道$model 到底是什么。但是使用Model::foo(),您已经在调用站点对类的名称进行了硬编码,而硬编码的内容通常会降低您的灵活性。差异可能看起来并不那么重要,但随着您技能的提高,它变得越来越重要。
  • 哦,谢谢您的建议!我知道了。实例方法在构建应用程序时给了我更多的灵活性和可维护性。我将学习更多关于 OOP 的知识!谢谢!!!
【解决方案2】:

你不想使用静态方法,因为那样你就放弃了许多不错的 yii 功能,例如默认范围、事件等。

如果可能,您也不想使用原始 SQL,因为这可能会使转换到其他数据库系统变得复杂。

所以你想做这样的事情:

public function getTrashedPostCount() {
    return $this->countByAttributes(array('publish_status' => 'trash'));
}

您可以看到您正在使用 CActiveRecord 的 countByAttributes 方法,并且好处是默认范围是自动应用的,因此您无需注意其中。我建议您花一些时间了解您可以使用哪些方法。

然后您可以像这样查询已删除帖子的数量:

Posts::model()->getTrashedPostCount()

或者甚至使用一些魔法

Posts::model()->trashedPostCount

【讨论】:

  • 另外请注意,您不必手动实例化模型,Posts::model() 会处理这个问题
  • 好的,我会花一些时间来学习 Active Records。我一直在犹豫是否使用 Active Records,因为我听说性能速度比原始 SQL 查询慢。
  • 所以,我最好不要在模型文件中使用静态方法。我明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多