如果在添加isset时总是设置为true


if always set to true when adding isset

乍一看,这个片段似乎很好。

// my_controller.php
$data['errors'] = (object)$this->session->userdata('errors_registration');
$this->load->view('registration/my_view',$data);
// print_r($data['errors'])
// stdClass Object
// (
//    [domain_err] => 0
//    [wbholder_err] => 0
//    [methodpayment_err] => 0
//    [createaccount_err] => 2
//    [gtc_err] => 0
// )
// my_view.php
if($errors->domain_err == 1) echo "TRUE"; else echo "FALSE"; // FALSE

$data['errors']为空时,

// print_r($data['errors'])
// stdClass Object
// (
//    [scalar] => 
// )
// my_view.php
if($errors->domain_err == 1) echo "TRUE"; else echo "FALSE";

我明白了,

遇到PHP错误严重性:通知消息:未定义的属性:stdClass::$domain_err

为了处理这个通知,我添加了isset(),使我的代码片段现在变成了if(isset($errors->domain_err) == 1),但是,由于这个更改,条件似乎总是设置为true,因此输出true。在保持我期望的条件输出的同时,是否还有其他方法可以绕过通知?

它总是为true的原因是,您现在正在将它与函数返回的值进行比较,这是true,因为设置了$errors->domain_err。您需要做的是将条件更改为:

如果(isset($errors->domain_err)&amp$errors->domain_err==1)

isset不返回变量的值,只返回变量是否存在。

以避免重复这种模式

if (isset($errors->domain_err) && $errors->domain_err == 1)

你可以写一个类似的函数

function check_value(&$variable) {
  return (isset($variable) ? &$variable : false);
}
if (check_value($errors->domain_err)) { echo "ERROR"; }
else { echo "NO ERROR"; }

为什么要尝试"忽略"错误消息?修复导致错误的原因。在这种情况下,您引用的成员在您使用的对象中不存在。在你发布的代码中,我没有看到你在哪里实例化了$errors类,也没有发布任何来自它的代码。去看看它是什么类,看看你是否看到一个名为$domain_err的成员变量被定义,并确保它被定义为公开可用。就我个人而言,我不喜欢给成员变量提供公共作用域,因为我更喜欢提供get/set类型的函数来设置或返回它们的值。