如果PHP是一种动态/弱类型语言,为什么我需要在PHP中使用array() ?


Why do I need array() in PHP, if PHP is a dynamic/weakly typed language?

我见过很多PHP代码有值和数组传递在这里和那里,有时,在中间,我看到$someVar = array();。当你在PHP中使用array()时,如果你已经可以传递数组,我认为这应该是PHP的优点之一。

以PHP手册为例,例1:

http://php.net/manual/en/functions.arguments.php

<?php
function takes_array($input)
{
    echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}
?>

然后从另一个站点的其他地方:

/**
 * Model for accessing schedule table
 *
 * @author Chris Hartjes
 */
class Schedule extends AppModel
{
    var $name = 'Schedule';
    var $useTable = 'sched2007';
    var $useDbConfig = 'stats';
    function get($week) {
        $scheduledGames = array();
        $team = array("a01" => "BUF", "a02" => "COU", "a03" => "HAG", "a04" => "TRI",
                    "a05" => "BOW", "a06" => "MCM", "a07" => "PHI", "a08" => "WMS",
                    "a09" => "LAW", "a10" => "PAD", "a11" => "POR", "a12" => "STL",
                    "n01" => "CSP", "n02" => "COL", "n03" => "MIN", "n04" => "SDQ",
                    "n05" => "BUZ", "n06" => "CAJ", "n07" => "DTR", "n08" => "SCS",
                    "n09" => "CRE", "n10" => "MAD", "n11" => "SEA", "n12" => "SPO");
        $results = $this->findAll("home LIKE 'a%' AND week = " . (int)$week);
        $data = array();
        foreach ($results as $result) {
            $home = $team[$result['Schedule']['home']];
            $away = $team[$result['Schedule']['away']];
            $data[$home] = array('home' => $home, 'away' => $away);
        }
        asort($data);
        foreach ($data as $home => $matchup) {
            $scheduledGames[$home] = $matchup;
        }
        $results = $this->findAll("home LIKE 'n%' AND week = " . (int)$week);
        $data = array();
        foreach ($results as $result) {
            $home = $team[$result['Schedule']['home']];
            $away = $team[$result['Schedule']['away']];
            $data[$home] = array('home' => $home, 'away' => $away);
        }
        asort($data);
        foreach ($data as $home => $matchup) {
            $scheduledGames[$home] = $matchup;
        }
        return $scheduledGames;
    }
}

$scheduledGames中,您有array(),然后$team只是动态地显示数组,然后$data又有array()。

在被愚蠢的风险,然而,正如在评论中指出的,我相信我混淆了这与隐式数组,所以数组隐式创建在PHP当它的一个键被分配的东西吗?

如果你可以传递数组,这意味着你需要一些方法来创建数组,对吗?这就是array(),它是创建数组的语言结构。

这类代码只是最佳实践:

$foo = array();
foreach ($bar as $baz) {
    $foo[] = $baz;
}
return $foo;

如果$bar是空的呢?那么循环将不会运行。如果在循环之前没有将$foo初始化为数组,那么在循环之后它将不存在。在这种情况下,return $foo会抛出一个错误,因为你试图返回一些不存在的东西。因此,你总是初始化你将要处理的变量。在几乎所有语言中都是这样。

PHP是一种真正的动态语言,有时(根据一些批评)甚至太多了。例如,您可能知道,即使没有初始化变量,也可以使用它们,只得到"notice"错误(尽管存在潜在的安全问题)。

像:$foo = array();这样的调用正是用于用空数组初始化变量的目的。如果您想在$foo(例如,array_push())上执行基于数组的函数,将其初始化为空数组是确保解析器将获得数组而不是先前初始化的变量(可能是也可能不是数组)的最佳方法。

最后,注意PHP中的$foo[n]构造函数也可以处理字符串,允许访问字符串的第n个字符。将$foo初始化为空数组还可以确保之前没有字符串(这可能会导致安全问题)。

PS:注意,从PHP 5.4开始,还有一个新的"简短语法"来创建和初始化数组,例如$foo = [];相当于$foo = array();。见http://php.net/manual/en/migration54.new-features.php

附录

作为澄清,也阅读你对其他答案的评论,可以先创建数组而不初始化它们。例如,$foo['bar'] = 'hello world'; ($foo之前没有初始化)可以工作。然而,这是非常不安全的:您无法知道$foo之前是什么,并且它可能已经在作用域中初始化/先前使用过(即使是其他开发人员,如果您在同一代码上工作!)——永远不要做假设)。在本例中,请参见以下代码:

<?php
// Previously somewhere in the code
$foo = 'hello world';
// … some other code
// Trying to create an array
$foo[0] = 'A';
var_dump($foo);
// Expected (if $foo was unset): array(1) { [0]=> string(1) "A" }
// Actual: string(11) "Aello world"

不用说,这是一个潜在的安全威胁

在您的示例中,$scheduledGames = array();的目的是将变量初始化为空数组,而不是定义其类型。这是一个重要的区别,因为$scheduleGames可以很容易地在代码中设置为字符串、整数或对象;它不绑定到数组类型。

在这个例子中,如果没有以这种方式初始化$scheduledGames, return $scheduledGames;行就会出现问题,因为调用这一行时可能没有findAll语句的任何结果,这将导致错误。