PHP - 重载的类函数

时间:2012-02-02 15:29:04

标签: php function

Helo everyone。

我有一个 MyClass 类和一个函数转义(),可以作为静态类或实例化对象调用。

MyClass::_escape('..... some string...');

$myclass->escape();

我想要的是不要在staic版本上使用下划线并且两者都具有相同的功能定义。我特意做。

    class MyClass {

    public $_string = "";

      public function escape($string = null) {

            if($string == null) 
                  return new String(mysql_real_escape_string($this->_string));
            else
                  return new String(mysql_real_escape_string($string)); 

      }


   }

但PHP解析器失败了这个函数。有没有办法做我上面尝试过的事情?

总而言之,我希望静态调用看起来像;

   print Myclass::escape('some string');

和实例化的调用看起来像;

   print $myobject->escape(); //Which escapes the private variable _string

希望这很清楚。

问候

3 个答案:

答案 0 :(得分:3)

public function _escape($s){
  return self::escape($s);
}

答案 1 :(得分:2)

如果没有至少某种错误,你想要实现的目标是行不通的:

示例使用static

error_reporting(E_ALL ^ E_STRICT);

class MyClass
{
  // note the *static* keyword
  public static function escape($string = null) {
    // $this is not defined, even if called as object-method 
    var_dump(isset($this));
  }
}

$foo = new MyClass();
$foo->escape(); // => bool(false)

MyClass::escape(); // => bool(false)

因此,如果您删除static关键字并重试,则会获得:

$foo->escape(); // => bool(true) 

但也是:

Strict Standards: Non-static method MyClass::escape() should
not be called statically ...

MyClass::escape(); // => bool(false) 

答案 2 :(得分:1)

您发布的代码中没有解析错误。实际上,只要你从未在对象上下文中将$string传递给escape()方法,它就像你希望它一样工作:

$foo = new MyClass();
$foo->_string = 'foo';
$foo->escape(); // This works.
MyClass::escape('bar'); // This works, too.
$foo->escape('baz'); // Don't do this.  It'll escape $string instead of $this->_string.

您可以在escape()方法中determining whether or not you're in a static context解决此问题,而不是检查是否存在$string