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
希望这很清楚。
问候
答案 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
。