【问题标题】:PHP creating a new object or use existing one if isset?PHP创建一个新对象还是使用现有对象如果isset?
【发布时间】:2011-11-28 19:18:25
【问题描述】:

很多时候我觉得这是多余的:

$found = $repo->findOneByCode($code);
$zone = isset($found) ? $found : new Zone();

谁能提出一个更好的方法,类似于(不工作):

$zone = $repo->findOneByCode($code) || new Zone();

编辑:我无法修改 ZonefindOneByCode,因为它们是由 Doctrine ORM 自动生成的类和函数。

【问题讨论】:

标签: php object new-operator ternary-operator isset


【解决方案1】:

如果您使用 >= PHP 5.3

$zone = $repo->findOneByCode($code) ?: new Zone();

否则也许这样更好? (还是有点丑)……

if ( ! ($zone = $repo->findOneByCode($code))) {
    $zone = new Zone();
}

假设失败,$repo->findOneByCode() 返回一个假值...

【讨论】:

  • @jondavidjohn findOneByCode() 是 Doctrine ORM api 的一部分,我无法控制它。
【解决方案2】:

您所描述的是一种惰性单例模式。这种情况下,该类只有一个实例,但在您尝试使用它之前它不会被初始化。

示例:http://blog.millermedeiros.com/2010/02/php-5-3-lazy-singleton-class/

【讨论】:

  • 我无法修改“Zone”类,因为它是自动生成的。并且包装它似乎有点矫枉过正......
  • 小心单身人士。它们通常因引入紧密耦合和使代码难以测试而受到反对。
【解决方案3】:

您可以执行以下操作:

$zone = ($z = $repo->findOneByCode($code)) ? $z : new Zone();

但是请注意,这并不像使用isset() 那样完全工作。虽然使用isset() 将允许NULL 以外的其他虚假值通过(例如FALSE),但使用a ? b : c 将解析为c在所有虚假值上。 p>

【讨论】:

    【解决方案4】:

    这两种方法也可以完成工作:

    $zone = $repo->findOneByCode($code) or $zone = new Zone();
    
    ($zone = $repo->findOneByCode($code)) || ($zone = new Zone());
    

    请注意,or&& 具有不同的优先级,这就是为什么我们需要在第二个示例中使用 ()。见http://www.php.net/manual/en/language.operators.logical.php。那里的例子是:

    // The result of the expression (false || true) is assigned to $e
    // Acts like: ($e = (false || true))
    $e = false || true;
    
    // The constant false is assigned to $f and then true is ignored
    // Acts like: (($f = false) or true)
    $f = false or true;
    
    var_dump($e, $f);
    

    结果:

    bool(true)
    bool(false)
    

    这是因为andor 的优先级低于=,这意味着分配将首先完成。另一方面,&&|| 的优先级高于=,这意味着逻辑运算将首先完成,并将其结果分配给变量。这就是为什么我们不能写:

    $result = mysql_query(...) || die(...);
    

    $result 将保存逻辑运算的结果(真或假)。但是当我们写的时候:

    $result = mysql_query(...) or die(...);
    

    赋值是在逻辑运算之前完成的。如果不是错误值,or 之后的部分将被完全忽略。

    【讨论】:

      猜你喜欢
      • 2012-07-15
      • 1970-01-01
      • 2019-03-12
      • 2019-09-23
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 2016-06-14
      • 2012-07-07
      相关资源
      最近更新 更多