php: два объекта из одного класса работают независимо друг от друга - PullRequest
1 голос
/ 04 мая 2010

Доброе утро,

Я бы хотел, чтобы код в моем контроллере выглядел примерно так:

<?php
$class = new sanitizeInput()

$string1 = $class -> input($_POST[name]) -> mysql_escape();
$string2 = $class -> input($_POST[age]) -> mysql_escape();

print "
     String1: $string1 <br />
     String2: $string2"
?>

Кажется, с моим классом sanitizeInput любое изменение в $ string2 применяется к $ string1. Какие способы я могу изменить это? Я бы предпочел внести изменения в класс, чтобы сделать мой контроллер максимально удобным для чтения.

Конечно, я знаю, что могу дважды создать экземпляр, но я бы хотел использовать один и тот же объект, если это возможно.

Было бы здорово, если бы мой класс:

  • Создайте один раз,
  • Установка ввода,
  • Скажите это mysql_escape и верните __toString в $ string1.
  • Установить ввод, оставив $ string2 в одиночку, mysql_escape и вернуть строку __toString в $ string2.

EDIT: Это мой полный код, запрошенный комментарием:

$name = $sanitize -> setInput($name) -> stripTags() -> mySql() -> replaceLinks('[ En webadresse ble sensurert her ]') -> trimWhitespace();
$age = $sanitize -> setInput($age) -> stripTags() -> mySql() -> replaceLinks('[ En webadresse ble sensurert her ]') -> trimWhitespace();


class Sanitizer {

    protected $_data;

    public function setInput($input) {
        $this -> _data = $input;
        return $this;
    }


    public function stripTags($array = NULL) {
        if (!is_null($array) and is_array($array)) {
            $allowedTags = implode('', $array);
            $this -> _data = strip_tags($this -> _data, $allowedTags);
        }
        else {
            $this -> _data = strip_tags($this -> _data);
        }
        return $this;
    }

    public function mySql() {
        $this -> _data = mysql_escape_string($this -> _data);
        return $this;
    }

    public function replaceLinks($replacement = NULL) {
        if (is_null($replacement)) {
            $replacement = '[ Potential web-address censored here ]';
        }
        $this -> _data = preg_replace('~[a-z0-9:/._-]+\.(biz|com|edu|gov|info|mil|net|org|as|eu|no|se|uk)[/a-z]{0,}~i', $replacement, $this -> _data);
        return $this;
    }

    public function trimWhitespace() {
        $this -> _data = trim($this -> _data);
        return $this;
    }

    protected function __toString() {
        $str = $this -> _data;
        return $str;
    }
}

Спасибо за ваше время.

С уважением,
Marius

1 Ответ

1 голос
/ 04 мая 2010

$string1 и $string2 будут ссылками на один и тот же объект вплоть до тех пор, пока вы не попытаетесь преобразовать значение в строку, поэтому любые сделанные вами изменения будут применены к обеим строкам. Я думаю, что вам нужно явно преобразовать объект в строку, чтобы предотвратить это, например,

$string1 = (string) $class -> input($_POST['name']) -> mysql_escape();
$string2 = (string) $class -> input($_POST['age']) -> mysql_escape();

Я не уверен, что использование «свободного» интерфейса здесь уместно, потому что вы не хотите, чтобы объект поддерживал состояние между вызовами, если вы хотите использовать один и тот же экземпляр в нескольких местах одновременно. Было бы лучше использовать разные объекты для каждой строки.

...