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

时间:2014-08-25 15:16:06

标签: php arrays

我见过很多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];
}
?>

然后从another site的其他地方开始:

/**
 * 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中你有数组(),然后$team只是动态显示数组,然后$data再次有数组()。

然而,正如评论中所指出的那样,冒着成为笨蛋的风险,我相信我会将这与隐式数组混淆,所以Are arrays implicitly created in PHP when one of its keys are assigned something?

3 个答案:

答案 0 :(得分:5)

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

这种代码只是最佳实践:

$foo = array();

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

return $foo;

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

答案 1 :(得分:3)

PHP是一种非常动态的语言,有时(根据一些批评)甚至过多。例如,您可能知道,即使未初始化变量,也可以使用变量,只会出现“通知”错误(尽管存在潜在的安全问题)。

调用如:$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"

毋庸置疑,这是一种潜在的安全威胁。

答案 2 :(得分:2)

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

在示例中,如果没有以这种方式初始化$scheduledGamesreturn $scheduledGames;行就会出现问题,因为可以调用此行而不会产生findAll语句的任何结果,这会导致错误。