php:来自同一个类的两个对象彼此独立地工作

时间:2010-05-04 14:20:31

标签: php class clone sanitization

早上好,

我希望控制器中的代码看起来像这样:

<?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。

编辑: 这是评论要求的完整代码:

$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 个答案:

答案 0 :(得分:1)

在尝试将值转换为字符串之前,

$string1$string2将引用同一个对象,因此您所做的任何更改都将应用于这两个字符串。我认为你必须明确地将对象转换为字符串以防止这种情况,例如。

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

我不确定在这里使用'流畅'界面是合适的,因为如果你想在同一时间在多个地方使用同一个实例,你真的不希望对象在调用之间保持状态。最好为每个字符串使用不同的对象。