-1

我正在尝试创建一个可以处理带有未定义变量的字符串的类。这可能吗?或者,还有更好的方法?

例如,如果我有以下内容并且希望此类 Looper$str_1使用变量获取并输出它$fname$lname填写...然后在其他地方我可以重用 Looper 类和进程$str_2,因为它们都需要$fname$lname.

class Looper {
    public function processLoop($str){
        $s='';
        $i=0;
        while ($i < 4){
            $fname = 'f' . $i;
            $lname = 'l' . $i;

            $s .= $str . '<br />';
            $i++;
        }
        return $s;
    }
}

$str_1 = "First Name: $fname, Last Name: $lname";
$rl = new Looper;
print $rl->processLoop($str_1);

$str_2 = "Lorem Ipsum $fname $lname is simply dummy text of the printing and typesetting industry";
print $rl->processLoop($str_2);
4

1 回答 1

2

为什么不直接使用strtr

$str_1 = "First Name: %fname%, Last Name: %lname%";
echo strtr($str_1, array('%fname%' => $fname, '%lname%' => $lname));

因此,如果您的班级:

public function processLoop($str){
    $s='';
    $i=0;
    while ($i < 4){
        $tokens = array('%fname%' => 'f' . $i, '%lname%' => 'l' . $i);
        $s .= strtr($str, $tokens) . '<br />';
        $i++;
    }
    return $s;
}

同样,如果您不想依赖命名占位符,您可以通过以下方式使用位置占位符sprintf

public function processLoop($str){
    $s='';
    $i=0;
    while ($i < 4){
        $s .= sprintf($str, 'f' . $i, l' . $i) . '<br />';
        $i++;
    }
    return $s;
}

在这种情况下,您的$str论点看起来像"First Name: %s, Last Name: %s"

所以在所有用法中:

// with strtr

$str_1 = "First Name: %fname%, Last Name: %lname%";
$rl = new Looper;
print $rl->processLoop($str_1);


// with sprintf

$str_1 = "First Name: %s, Last Name: %s";
$rl = new Looper;
print $rl->processLoop($str_1);
于 2013-01-01T02:25:30.030 回答