首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php,静态方法重载

问php,静态方法重载
EN

Stack Overflow用户
提问于 2012-03-21 17:33:17
回答 2查看 2.4K关注 0票数 2

我有一个带有方法的对象,有时需要以静态方式调用,有时则不需要。

代码语言:javascript
复制
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);

我是这样解决的:

代码语言:javascript
复制
public static function MYOBJECT::GetGroupName($_id=NULL)
{
  if( is_object($_id) ) $_id = $_id->GetGroupId();

  ...
}

$name = MYOBJECT:GetGroupName(4);
$name = $obj->GetGroupName($obj);

但是,还有更优雅的东西吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-21 18:10:56

你应该避免在一般的[article]中使用静态调用。

在这种情况下,你甚至会让事情变得更糟,因为你显然希望同一个函数有两种不同的行为。这就是拥有两个独立函数的充分理由。此外,没有“更优雅”的方法可以做到这一点。你唯一能改变的就是假设,当函数被一个参数调用时,它就是静态的。其他选择要么包括反射(缓慢),要么包括debug_backtrace() (丑陋)。

我可以推荐你去看一些“干净代码演讲”的讲座。即使这不能说服你改变你的风格,它也会给你一个坚实的概念介绍,比如依赖注入和单元测试:

此外,您真的应该停止使用旧的mysql_*函数作为access MySQL的API。他们已经10多岁了,不再维护了,社区已经开始了deprecation的过程。

您应该仔细研究一下替代方案:PDO和MySQLi。它们都提供了使用预准备语句的能力。

票数 3
EN

Stack Overflow用户

发布于 2012-07-20 01:21:21

一种更好的方法可能是将group_id => group_name隔离为静态方法。而不仅仅是重用所述方法

代码语言:javascript
复制
<?php
class MYOBJECT
{
  private $group_id;

  public function SetGroupId($_id) { $this->group_id = $_id; }

  public function GetGroupName() { 
    return self::GetGroupNameByID($this->group_id);
  }
  public function GetGroupId() { return $this->group_id; }

  public static function GetGroupNameByID($_id)
  {
    // Check if $_id is MYOBJECT
    $id = $_id instanceof self ? $_id->GetGroupID() : $_id;

    $query mysql_query("SELECT name FROM group WHERE id = $id");
    list($name) = mysql_fetch_array($query);

    return $name;
  }
}

$name = MYOBJECT::GetGroupNameByID(4);
$name = MYOBJECT::GetGroupNameByID($obj);
$name = $object->GetGroupName();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9801816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档