【问题标题】:Why do I need array() in PHP, if PHP is a dynamic/weakly typed language? [closed]如果 PHP 是动态/弱类型语言,为什么我需要在 PHP 中使用 array()? [关闭]
【发布时间】:2014-08-25 15:16:06
【问题描述】:

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

以PHP手册为例:

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

然而,正如评论中指出的那样,我认为我将这与隐式数组混淆了,所以Are arrays implicitly created in PHP when one of its keys are assigned something?

【问题讨论】:

  • 当您需要创建数组时,您在 PHP 中使用 array()....
  • $team 上面没有声明为 Array(),或者至少我能找到。
  • 这是一个非常具体的问题。不知道为什么它会被否决。
  • $team = array("a01" =&gt; "BUF.....); 没有将 $team 定义为数组的哪一部分是您遗漏的?见PHP docs
  • 你能用$foo[] = "bar";创建一个数组吗?是的。你应该?不!简单

标签: php arrays


【解决方案1】:

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

这种代码简直就是最佳实践:

$foo = array();

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

return $foo;

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

【讨论】:

  • 我明白这一点。我认为您可以简单地创建它们而无需显式使用 Array(),这是我的观点。
  • 我要补充一点,尽管 PHP 是弱类型的,但简单变量(整数、浮点数、字符串)与数组根本不同,而数组又与对象根本不同。它们仍然需要一种创建它们的方法,即使简单类型的声明方式没有不同。
  • @johnny 例如如何?
  • @deceze 是我的误解。
  • @johnny 好的。重申一下:是的,可以隐式创建数组,例如使用$foo['bar'] = 'baz'。但是,同样,在上面的示例中,您只是初始化变量本身以避免潜在的错误。它被初始化为一个数组,因为它应该是一个数组,这有点离题了。
【解决方案2】:

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

附录

作为澄清,也可以在您的 cmets 阅读其他答案,可以在不先初始化数组的情况下创建数组。例如$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"

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 2020-08-02
      • 2012-12-12
      • 2013-11-20
      • 2010-12-05
      • 2016-11-13
      • 2012-06-30
      相关资源
      最近更新 更多