我有一个带有方法的对象,有时我需要将其作为静态调用,有时则不需要。
class MYOBJECT
{
private $group_id;
public function SetGroupId($_id) { $this->group_id = $_id; }
public static function GetGroupName($_id=NULL)
{
// is there any way to implement condition like this?
if( _called_as_static ) $id = $_id;
else $id = $this->group_id;
$query mysql_query("SELECT name FROM group WHERE id = $id");
list($name) = mysql_fetch_array($query);
return $name;
}
}
$obj = new MYOBJECT;
$obj->SetGroupId(4);
// should work both ways
$name = $obj->GetGroupName();
$name = MYOBJECT::GetGroupName(4);
我是这样解决的:
public static function MYOBJECT::GetGroupName($_id=NULL)
{
if( is_object($_id) ) $_id = $_id->GetGroupId();
...
}
$name = MYOBJECT:GetGroupName(4);
$name = $obj->GetGroupName($obj);
但是,还有更优雅的东西吗?
最佳答案
一般情况下您应该避免使用静态调用 [article] .
在这种情况下,你甚至会让情况变得更糟,因为你显然期望同一函数有两种不同的行为。这就是拥有两个独立功能的充分理由。此外,没有“更优雅”的方式来做到这一点。唯一可以改变的就是假设,每当使用参数调用函数时,它都是静态的。其他替代方案包括反射(速度很慢)或 debug_backtrace()(非常难看)。
我可以推荐您观看“Clean Code Talks”中的一些讲座。即使这不能说服您改变您的风格,它也会为您提供依赖注入(inject)和单元测试等概念的可靠介绍:
- Unit Testing
- Inheritance, Polymorphism, & Testing
- Global State and Singletons
- Don't Look For Things!
此外,您确实应该停止使用旧的 mysql_*
函数作为访问 MySQL 的 API。它们已有 10 多年历史,不再维护,社区已开始 deprecation 的过程。
关于php,静态方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9801816/