3

我正在寻找调用多个字符串并将它们连接成一个字符串。我希望能够检查所有被调用的字符串是否都已设置,而不必 isset(); 使用的每一个字符串。

我最想拥有的:

<?php

$name      = "John Smith";
$age       = "106";
$favAnimal = "pig";
$email     = "john@smith.com";
$sport     = "tennis";

$userDescription = "My name is $name, I am $age years old, I like $sport.";

if(allStringsSet($userDescription)){
    echo $userDescription; //Or do something else
}

?>

你会注意到我没有调用所有的字符串,因为在我的应用程序中并不是所有的字符串都会一直使用。此外,我的应用程序将从大约 50 个字符串中进行选择,并且我需要能够检查任何是否已设置而没有一堆 isset();s 无处不在。

我希望在声明 $userDescription 之前需要进行 isset 检查。如何检查一组未知的字符串以查看它们是否已设置?

4

6 回答 6

2

使用带有自定义 getter 和 setter 的对象。

class CustomStrings()
{
    protected $data;

    public function __set($key, $value) {
        $this->data[$key] = $value;
    }

    public function __get($key) {
        if (isset($data[$key])) {
            return $data[$key];
        }
        return false;
    }

    public function getDescription($description) {
        // regex to find the words following : (or any other char)
        // look for the variables, and do whatever handling you want if they're not found
        // return whatever you want 
        // IF you don't want to do a regex, you can do the following
        foreach ($this->data as $key => $value) {
            $description = str_replace(":$key", $value, $description);
        }
        if (strpos(':', $description) !== FALSE) {
            return $description;
        }
        return false; // or whatever error handling you want
    }
}

$strings = new CustomStrings();
$strings->name = 'John';
$strings->age = 16;
$strings->sport = 'Football';

$description = $strings->getDescription("My name is :name, I am :age years old, I like :sport");

您将使用正确的键将所有变量存储在 CustomStrings 对象中,而不是编写$name,而是编写:name.

isset只在getDescription函数中执行一次处理。

因为我很懒,所以我没有写正则表达式。如果您想在字符串中使用:,请将其替换为您不会使用的内容。

祝你好运!

于 2013-06-12T13:28:11.463 回答
1

如果您需要定义所有变量,PHP 的isset()支持多个值,因此您可以这样做

<?php

$name      = "John Smith";
$age       = "106";
$favAnimal = "pig";
$email     = "john@smith.com";
$sport     = "tennis";  

if(isset($name, $age, $favAnimal, $email, $sport)) {
    $userDescription = "My name is $name, I am $age years old, I like $sport.";

    echo $userDescription; //Or do something else
}

?>
于 2013-06-12T12:48:58.360 回答
0

你应该把它们放在数组中并使用循环。

$data = array();
$data['name']      = "John Smith";
$data['age']       = "106";
$data['favAnimal'] = "pig";
$data['email']     = "john@smith.com";
$data['sport']     = "tennis";

$userDescription = "My name is $name, I am $age years old, I like $sport.";
$required_fields = array('name', 'age', 'favAnimal', 'email', 'sport');

if(checkData($data,$required_fields)) echo 'all fields are ok';
else echo 'not all fields are OK';

function checkData($data, $requiredFields)
{ 
   foreach($requiredFields as $field)
   {
     if((array_key_exists($field, $data) && !empty($data[$field]))  == false) return false;
   }
   return true;
}

功能检查数据需要 2 个参数,都是数组。

  1. $data是要检查的数据。

  2. $requiredFields是需要设置且不能为空的必填字段数组

于 2013-06-12T12:47:24.067 回答
0

为什么不将字符串存储在数组中?然后你可以使用 foreach 循环。这样你就必须使用 isset() 一次!

$strings = new Array('string1', 'string2', 'string3')
foreach($strings as $str)
{
   if(isset($str))
   {
      //do something..
   }
}
于 2013-06-12T12:47:41.873 回答
0

另一种方法是使用未定义变量在字符串中时生成的 E_NOTICE,这样,您会自动检查字符串中的变量。

问题是,您不能 CATCH E_NOTICE,您必须使用自定义错误处理程序:

<?php
function handleError($errno, $errstr, $errfile, $errline, array $errcontext)
{
  throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}

$var1 = "one";
$var2 = "two";
$var4 = "four";

error_reporting(E_ALL);

set_error_handler('handleError');

try {
  echo "Hey $var1, I like $var2 but not $var3 . Tell that to $var4";

  //This will throw a Notice: Undefined variable: var3 in /t.php on line 8
} catch (Exception $e) {
  echo "Well, it looks like some vars were not set.";
}

restore_error_handler()

?>

它有点难看,但 100% 自动。

于 2013-06-12T13:31:54.510 回答
0

如果您想要拥有变量而不使用 isset,则一种可能的解决方案:

以这种方式定义您的字符串:

$userDescription = "My name is [name], I am [age] years old, I like [sport].";

或者您不必以这种方式更新您的字符串,您只需将引号从"to更改为'不会解析变量。

现在,从您的字符串中获取所有“变量”([]上面示例中的文本)。为此,请使用带有(preg_split()或其他内容)的正则表达式。

现在将它们用作变量的变量并测试它们是否不为空。

例如:

for ($i = 0; $i < counr($result); $i++) 
{
  if (($result[$i] == 'name') && (${$results[$i]} == "")) echo "Name is empty"
  if (($result[$i] == 'age') && (is_int(${$results[$i]}) == false)) echo "Age is empty"
  ....
}

上面的代码不工作 PHP,或多或少是伪代码和如何完成它的步骤。

于 2013-06-12T12:49:52.177 回答