【问题标题】:PHP Conditional Operator and Self AssignmentPHP 条件运算符和自赋值
【发布时间】:2010-11-21 01:29:56
【问题描述】:

这种事情在 PHP 中被认为可以吗?

$foo = $_GET['foo'];
$foo = empty($foo) || !custom_is_valid($foo) ? 'default' : $foo;

有没有更清洁的替代品?我基本上是在尝试避免额外的表格查找。

【问题讨论】:

    标签: php variable-assignment conditional-operator


    【解决方案1】:

    custom_is_valid() 是否检查空变量?因为能够删除 empty() 和“或不”对改进代码大有帮助。

    【讨论】:

    • 如果$_GET['foo'] 不存在,它仍然会抛出警告。
    • 仅使用:"$foo = custom_is_valid($_GET['foot']);",并在 custom_is_valid(..) 检查数据,¿ok?
    【解决方案2】:

    如果您打开error_reporting(E_ALL),您将会看到,这并不是最好的方法。 PHP基本上是想让你做的

    $foo = empty($_GET['foo']) || !custom_is_valid($_GET['foo']) ? 'default' : $_GET['foo'];
    

    【讨论】:

    • PHP 规范是否为表查找提供任何性能保证?
    • 我无法想象是什么让您认为存在 PHP 规范。 ://
    • 我不知道。 ;) 我有 C++ 背景,几个小时前我才开始使用 PHP。
    • 啊。 :) 是的,PHP 的定义不是很严格。我怀疑这三个查找的性能会很棒,但它会比让 PHP 生成警告(无论是否显示被抑制)要好。如果您关心性能,基本上应该始终使用error_reporting(E_ALL | E_STRICT) 运行,并消除 PHP 抱怨的任何内容,因为生成这些警告非常慢。
    • 实际上,与典型脚本所做的其他事情相比,额外的查找成本微不足道;您将无法衡量任何差异。
    【解决方案3】:

    怎么样:

    $foo = 'default';
    if (array_key_exists('foo', $_GET) and custom_is_valid($_GET['foo'])) {
        $foo = $_GET['foo'];
    }
    

    不要害怕数组查找,它们并没有那么慢 :)

    【讨论】:

      【解决方案4】:

      也许不只是检查它是否有效,而是通过一个采用默认值的清理函数来运行它。

      另外,我喜欢使用以下函数,因此在运行 E_STRICT 时不会收到访问不存在的数组键的警告:

      function GetVar($var, $default = '') {
        $value = $default;
        if(isset($_GET[$var])) {
          $value = $_GET[$var];
        }
        return $value;
      }
      
      function custom_clean($value, $default = '') {
        ... validation logic or return $default ...
      }
      
      $foo = custom_clean(GetVar('foo'), 'default');
      

      【讨论】:

        【解决方案5】:

        这里的课程会让你的生活更轻松。

        <?php
        
        class ParamHelper
        {
          protected $source;
        
          public function __construct( array $source )
          {
            $this->source = $source;
          }
        
          public function get( $key, $default=null, $validationCallback=null )
          {
            if ( isset( $this->source[$key] ) && !empty( $this->source[$key] ) )
            {
              if ( is_null( $validationCallback ) || ( !is_null( $validationCallback ) && call_user_func( $validationCallback, $this->source[$key] ) ) )
              {
                return $this->source[$key];
              }
            }
            return $default;
          }
        }
        
        // Just for the demo
        function validateUpper( $value )
        {
          return ( $value == strtoupper( $value ) );
        }
        
        // Mimic some query-string values
        $_GET['foo'] = 'bar';
        $_GET['bar'] = 'BAZ';
        $_GET['lol'] = 'el oh el';
        
        $getHelper = new ParamHelper( $_GET );
        
        echo $getHelper->get( 'foo', 'foo default', 'validateUpper' ), '<br>';
        echo $getHelper->get( 'bar', 'bar default', 'validateUpper' ), '<br>';
        echo $getHelper->get( 'baz', 'baz default' ), '<br>';
        echo $getHelper->get( 'lol' ), '<br>';
        echo $getHelper->get( 'rofl' ), '<br>';
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-09
          • 2011-03-11
          • 2011-09-18
          • 1970-01-01
          • 2011-08-02
          • 2015-06-06
          • 1970-01-01
          • 2011-11-16
          相关资源
          最近更新 更多