Yii和静态函数

时间:2014-02-05 18:07:22

标签: php yii static-methods

拥有大量静态功能是不好的做法?我正在使用Yii框架,我意识到我的模型类中有很多静态函数。我把与User有关的所有函数都放到了UsersModel中(我也对其他模型做了同样的事情),但我最终得到了很多静态函数。只是想知道你们如何处理这个问题。很多这些函数只是查询构建器函数而不是延迟加载,因为我需要提高数据库性能。

示例功能:

User::getUserFromCampaign(1)
User::getUsersNotInCamapaigns()
User::isAdmin()

3 个答案:

答案 0 :(得分:1)

您可以做的是在需要这些方法的模型中实例化User类的对象(可能不是静态类),而不是使用静态函数,并直接使用对象的方法。

这也意味着这些方法只会加载到需要它们的对象上,而不是“全局”。

这是一个很好的答案:https://softwareengineering.stackexchange.com/questions/98083/cant-i-just-use-all-static-methods

答案 1 :(得分:1)

实例化您的类最适合测试,但对于某些任务使用静态没有问题。

很多都是观点,如果你的代码有效,它运行效率高,易于维护,那么一切都很花哨!

还要添加到Laravel门面评论。 Laravel确实实例化了这个类,一个外观只是为更大的图片提供了一个简化的界面,让我们说..这正是laravel正在做的事情。最终的结果是非常好的可读代码。

答案 2 :(得分:0)

MVC是一个很好的设计模式,它有它的位置。工厂设计模式是另一个很好的模式。如果您不熟悉它,Google Factory design pattern。简而言之:FooFactory是一个生成Foo类对象的类(如果愿意,还可以生成FooModel类)。

MVC和Factory不是互斥的,因此您可以将许多静态方法重构为新的UserFactoryClass。

  • User::getUserFromCampaign(1)对我来说,有点奇怪。我认为1是广告系列ID?然后用户返回什么?或者广告系列只能有一个用户?如果是这种情况,那么UserFactory::getUserFromCampaign()将为具有给定ID的广告系列中的用户返回UserModel对象。

  • 我假设
  • User::getUsersNotInCampaign()返回一个UserModel对象数组?将其重构为`UserFactory::getUsersNotInCampaign()然后你去。

  • User::isAdmin()根本不应该是静态的。 if ($user->isAdmin()) ...,而不是if(User::isAdmin($user))...