【问题标题】:$variable = $variable = $variable = array()$变量 = $变量 = $变量 = 数组()
【发布时间】:2018-08-03 20:50:08
【问题描述】:

我正在处理服务器端数据表。我有这个例子,我不明白。

这部分到底在做什么,为什么其中一些在实际变量之前被调用?

$params = $columns = $totalRecords = $data = array(); 

或者这个

$where_condition = $sqlTot = $sqlRec = "";

我搜索了答案,但我发现是变量变量,例如 $$a

<?php

    require_once("../connections/mysqli_connect.php");

    $params = $columns = $totalRecords = $data = array();

    $params = $_REQUEST;

    $columns = array(
        0 => 'post_id',
        1 => 'post_title', 
        2 => 'post_desc'
    );

    $where_condition = $sqlTot = $sqlRec = "";

    if( !empty($params['search']['value']) ) {
        $where_condition .= " WHERE ";
        $where_condition .= " ( post_title LIKE '%".$params['search']['value']."%' ";    
        $where_condition .= " OR post_desc LIKE '%".$params['search']['value']."%' )";
    }

    $sql_query = " SELECT * FROM li_ajax_post_load ";
    $sqlTot .= $sql_query;
    $sqlRec .= $sql_query;

    if(isset($where_condition) && $where_condition != '') {

        $sqlTot .= $where_condition;
        $sqlRec .= $where_condition;
    }

    $sqlRec .=  " ORDER BY ". $columns[$params['order'][0]['column']]."   ".$params['order'][0]['dir']."  LIMIT ".$params['start']." ,".$params['length']." ";

    $queryTot = mysqli_query($con, $sqlTot) or die("Database Error:". mysqli_error($con));

    $totalRecords = mysqli_num_rows($queryTot);

    $queryRecords = mysqli_query($con, $sqlRec) or die("Error to Get the Post details.");

    while( $row = mysqli_fetch_row($queryRecords) ) { 
        $data[] = $row;
    }   

    $json_data = array(
        "draw"            => intval( $params['draw'] ),   
        "recordsTotal"    => intval( $totalRecords ),  
        "recordsFiltered" => intval($totalRecords),
        "data"            => $data
    );

    echo json_encode($json_data);

【问题讨论】:

  • 您具体询问的是.= 还是[...] = $something = $something_else
  • 变量刚刚被初始化。是短手。在 $params 行中,它们都被设置为一个空数组。在 $where_condition 行中,它们都被设置为注意。
  • 代码审查是这个问题的更好的地方......哦等等,它已经存在:codereview.stackexchange.com/questions/94299/…
  • PS:这样做没有错,我什至在将多个调试变量初始化为空时经常这样做。最好在一行代码中将它们全部打完,而不是十个左右的块哈哈:)所以 YMMV。
  • 感谢大家的帮助和codereview链接。

标签: php arrays variables datatables


【解决方案1】:

这称为多重分配或chained assignment

您可以在 PHP 中执行此操作,原因有两点:

  1. PHP 按值分配
  2. 赋值是一个有值的表达式(被赋值的值)

所以对于您示例中的表达式$params = $columns = $totalRecords = $data = array();

  • $data = array()$data 分配一个文字值(一个空数组),但它也是一个计算结果为空数组的表达式。

  • $totalRecords = $data = array() 将表达式$data = array()赋给$totalRecords,但它也是一个计算结果为空数组的表达式。

等等。

需要注意的是,因为所有的赋值都是按值完成的,所以每个赋值的变量都有自己的值,并且在赋值之后它们都没有内在的相互关联,例如将值附加到 $data[] = 'something'; 之类的变量之一对 $totalRecords 或一起分配的任何其他变量没有任何作用。

为了以后的参考,它对scalar types and arrays是这样工作的,但是如果分配的值是一个对象,效果就不同了。每个变量都持有同一个对象标识符的副本,所以它们都引用同一个对象,例如:

$one = $two = $three = new StdClass;
$three->newProperty = 'value';
echo $one->newProperty;  // echoes value

【讨论】:

    【解决方案2】:

    这意味着所有变量都被分配给右侧的相同值。同理:

    $data = array();
    $totalRecords = $data; // which is an empty array (array())
    $columns = $totalRecords; // which is an empty array (array())
    $params = $columns; // which is an empty array (array())
    

    $sqlRec = "";
    $sqlTot = $sqlRec; // which is ""
    $where_condition = $sqlTot; // which is ""
    

    【讨论】:

    • 你对我来说很清楚。谢谢。不过我不能投票,所以我希望其他人也可以。
    • ...但您应该已经能够将答案限定为“已接受的答案”。
    【解决方案3】:

    文档说:

    基本的赋值运算符是“=”。您的第一个倾向可能是将此视为“等于”。不。这实际上意味着左边的操作数被设置为右边表达式的值(即“被设置为”)。

    http://php.net/manual/en/language.operators.assignment.php

    下表按优先级顺序列出了运算符,最高优先级的运算符位于顶部。同一行的运算符具有相同的优先级,在这种情况下,关联性决定分组。

    right = += -= *= **= /= .= %= &= |= ^= >= 赋值

    http://php.net/manual/en/language.operators.precedence.php

    这意味着,当使用= 时,表达式从右到左计算。 所以..这个:

    $params = $columns = $totalRecords = $data = array(); 
    

    是一样的

    $data = array();
    $totalRecords = $data;
    $columns = $totalRecords;
    $params = $columns;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 2016-04-19
      相关资源
      最近更新 更多