2012-02-02 2 views
2

Helo every.PHP - Перегруженная функция класса

У меня есть класс 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

Спасибо всем за ваши предложения .. комментарии. Я узнаю немного больше каждый день. :) – IEnumerable

ответ

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. 

Вы могли бы решить эту проблему determining whether or not you're in a static context в рамках метода escape(), вместо проверяя наличие $string.

+0

милый, это то, что я был после, чистый просто. thankyou – IEnumerable

+0

@IEnumerable: Рад, что я мог бы помочь. :-) – FtDRbwLXw6

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

+0

Таким образом, вы предлагаете иметь обе функции, но объект с активизацией вызывает статическую функцию. Если это так, то, что у меня есть, просто было бы хорошо иметь одно и то же имя функции. ..оценки – IEnumerable

+0

это ваш лучший выбор, учитывая ваш сломанный дизайн – dynamic

+0

нормально, так что одноименное имя невозможно?Ive кодировал в PHP 5 в течение 2 месяцев и просто пытался понять ограничения – IEnumerable

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) 

Итак, если вы удалите t он static ключевое слово и попробовать еще раз, вы получите:

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

, но также:

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

для

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