Có cần khai báo mảng PHP trước khi thêm giá trị bằng [] không?


81
$arr = array(); // is this line needed?
$arr[] = 5;

Tôi biết nó hoạt động mà không cần dòng đầu tiên, nhưng nó thường được đưa vào thực tế.

Lý do là gì? Không có nó thì có an toàn không?

Tôi biết bạn cũng có thể làm điều này:

 $arr = array(5);

nhưng tôi đang nói về những trường hợp bạn cần thêm từng mục một.


2
Trừ khi bạn muốn thông báo về các biến chưa được khai báo, tôi khuyên bạn nên khởi tạo. Thêm vào đó, nó chỉ tạo ra mã dễ đọc (rõ ràng là như vậy $foo = array()và nó không phải là một chuỗi được chuyển thành một mảng, v.v.).
Brad Christie

6
@Brad Christie: Ngoại trừ điều đó không kích hoạt một thông báo như vậy.
BoltClock

3
@BoltClock: Phụ thuộc vào phiên bản bạn đang làm việc .
Brad Christie

Câu trả lời:


92

Nếu bạn không khai báo một mảng mới và dữ liệu tạo / cập nhật mảng không thành công vì bất kỳ lý do gì, thì bất kỳ mã nào trong tương lai cố gắng sử dụng mảng sẽ E_FATALdo mảng không tồn tại.

Ví dụ, foreach()sẽ xuất hiện một lỗi nếu mảng không được khai báo và không có giá trị nào được thêm vào nó. Tuy nhiên, không có lỗi nào xảy ra nếu mảng chỉ đơn giản là trống, như trường hợp bạn đã khai báo.


Được ủng hộ vì foreachví dụ và thực tế là lỗi được kích hoạt dường như phụ thuộc vào phiên bản PHP bạn đang chạy.
Charles Sprayberry

1
Tôi không hiểu câu trả lời đó. Không khai báo và không thêm một cái gì đó có nghĩa là tôi đã không viết vào mã nguồn.
Gordon

2
@Gordon, ví dụ về một cái gì đó sẽ không hoạt động nếu $ cái gì đó không bằng 1: if ($ something == 1) {$ rows [] = "a"; $ row [] = "b"; } foreach ($ lines as $ row) {} Có thể tránh được lỗi nếu $ row được khai báo là $ row = array (); trước khi câu lệnh if xảy ra.
djdy

1
Tôi đồng ý (tôi đã biểu quyết) nhưng cuộc sống quá ngắn để tuyên bố mọi thứ, mọi lúc, mặc dù chúng tôi biết đó là điều "đúng đắn" phải làm. Ngoài ra, tôi đoán bạn có thể sử dụng is_array () nếu bạn lo lắng về các mảng chưa được khai báo. Giống như hầu hết mọi thứ, phụ thuộc vào các chi tiết.
PJ Brunet

24

Chỉ muốn chỉ ra rằng tài liệu PHP trênarrays thực sự nói về điều này trong tài liệu.

Từ trang web PHP, với đoạn mã đi kèm:

$arr[key] = value;
$arr[] = value;
// key may be an integer or string
// value may be any value of any type

"Nếu $arrchưa tồn tại, nó sẽ được tạo, vì vậy đây cũng là một cách thay thế để tạo mảng."

Nhưng, như các câu trả lời khác đã nêu ... bạn thực sự nên khai báo một giá trị cho các biến của mình vì tất cả những điều tồi tệ có thể xảy ra nếu bạn không làm như vậy.


15

Php là một ngôn ngữ được đánh máy lỏng lẻo. Nó hoàn toàn chấp nhận được. Điều đó đang được nói, các lập trình viên thực sự luôn khai báo vars của họ.


1
@Gordon chính xác những gì tôi đang nghĩ;)
AlienWebguy

6

Hãy nghĩ về những lập trình viên sau bạn! Nếu bạn chỉ nhìn thấy $arr[] = 5, bạn sẽ không biết điều gì $arrcó thể xảy ra nếu không đọc tất cả mã trước đó trong phạm vi. Dòng rõ ràng $arr = array()làm cho nó rõ ràng.


1
Trong PHP 5.4.x - 5.6.x: $ arr = [] cũng hoạt động.
Anthony Rutledge

4

nó chỉ là thực hành tốt. Giả sử bạn đang thêm vào mảng của mình bên trong một vòng lặp (thực tế khá phổ biến), nhưng sau đó truy cập vào mảng bên ngoài vòng lặp đã nói. Nếu không có khai báo mảng, mã của bạn sẽ gặp lỗi nếu bạn không bao giờ đưa nó vào vòng lặp.


3

Tôi thực sự khuyên bạn nên khai báo mảng trước khi thêm giá trị. Ngoài mọi thứ được đề cập ở trên, nếu mảng nằm trong một vòng lặp, bạn có thể vô tình đẩy các phần tử vào mảng của mình. Tôi chỉ quan sát thấy điều này tạo ra một lỗi tốn kém.

//Example code    
foreach ($mailboxes as $mailbox){
       //loop creating email list to get
       foreach ($emails as $email){
          $arr[] = $email;
       }
       //loop to get emails
       foreach ($arr as $email){
       //oops now we're getting other peoples emails
       //in other mailboxes because we didn't initialize the array
       }
}

Đừng làm gì ??
ryanve

1

Bằng cách không khai báo một mảng trước khi sử dụng nó thực sự có thể gây ra vấn đề. Một kinh nghiệm tôi vừa tìm thấy, tôi đã gọi tập lệnh thử nghiệm này như sau: indxtest.php? File = 1STLSPGTGUS Điều này hoạt động như mong đợi.

//indextest.php?file=1STLSPGTGUS
$path['templates']     = './mytemplates/';
$file['template']      = 'myindex.tpl.php';
$file['otherthing']      = 'otherthing';
$file['iamempty']    = '';

print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");

print ("file['file'] = " . $file['file'] . "<br>");// should give: "Notice: Undefined index: file"
print ("file = " . $file);// should give: "Notice: Undefined index: file"

//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = myindex.tpl.php
file['otherthing'] = otherthing
file['iamempty'] =

Notice: Undefined index: file in D:\Server\Apache24\htdocs\DeliverText\indextest.php on line 14
file['file'] =

Notice: Array to string conversion in D:\Server\Apache24\htdocs\DeliverText\indextest.php on line 15
file = Array
*/

Bây giờ tôi sẽ chỉ yêu cầu một tệp, từ một tập lệnh khác mà tôi đã mua, ở trên cùng của tôi và chúng ta có thể thấy các giá trị hoàn toàn sai đối với tệp mảng $ trong khi mảng $ đường dẫn là OK: "checkgroup.php" là lỗi.

//indextest.php?file=1STLSPGTGUS
require_once($_SERVER['DOCUMENT_ROOT']."/IniConfig.php");
$access = "PUBLIC";
require_once(CONFPATH . "include_secure/checkgroup.php");
$path['templates']     = './mytemplates/';
$file['template']      = 'myindex.tpl.php';
$file['otherthing']      = 'otherthing.php';
$file['iamempty']    = '';

print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");

print ("file['file'] = " . $file['file'] . "<br>");
print ("file = " . $file);

//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = o
file['otherthing'] = o
file['iamempty'] = o
file['file'] = o
file = oSTLSPGTGUS
*/

Khởi tạo mảng trước, sau đó không có vấn đề!

//indextest.php?file=1STLSPGTGUS
require_once($_SERVER['DOCUMENT_ROOT']."/IniConfig.php");
$access = "PUBLIC";
require_once(CONFPATH . "include_secure/checkgroup.php");

$path = array();
$file = array();

$path['templates']     = './mytemplates/';
$file['template']      = 'myindex.tpl.php';
$file['otherthing']      = 'otherthing.php';
$file['iamempty']    = '';

print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");

print ("file['file'] = " . $file['file'] . "<br>");
print ("file = " . $file);

//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = myindex.tpl.php
file['otherthing'] = otherthing.php
file['iamempty'] =
file['file'] =
file = Array
*/

Đó là cách tôi nhận ra tầm quan trọng của việc khởi tạo các biến vì chúng ta không bao giờ biết được vấn đề mà chúng ta có thể gặp phải sau này và chỉ vì muốn tiết kiệm thời gian, chúng ta có thể sẽ lãng phí nhiều hơn vào cuối cùng. Tôi hy vọng điều này sẽ hữu ích cho những người không chuyên như tôi.


1

Câu hỏi cũ nhưng tôi chia sẻ điều này vì đây là một trường hợp sử dụng trong đó mã đơn giản hơn nếu mảng không được khai báo.

Giả sử bạn có danh sách các đối tượng bạn cần lập chỉ mục trên một trong các thuộc tính của chúng.

// $list is array of objects, all having $key property.
$index = [];
foreach ($list as $item)
    $index[$item->key][] = $item; // Dont care if $index[$item->key] already exists or not.

0

Nó phụ thuộc vào việc kiểm tra lỗi của bạn. Nếu bạn gặp lỗi khi báo cáo về mức độ nghiêm ngặt, nó sẽ thông báo cho bạn nhưng về mặt kỹ thuật, nó vẫn hoạt động nếu không có nó.


0

Nó tốt trong trường hợp bạn cần nó như một biến toàn cục hoặc muốn sử dụng lại cùng một mảng trong các hàm khác nhau


0

Đây là mã của bạn

$var[]  = 2;
print_r($var)

Hoạt động tốt! cho đến khi ai đó khai báo cùng một tên biến trước mã quyến rũ của bạn

$var = 3; 

$var[]  = 2;
print_r($var)

Cảnh báo: Không thể sử dụng giá trị vô hướng dưới dạng một mảng

Giáo sư!

Đây là một trường hợp có thể xảy ra (đôi khi không thể đoán trước), vì vậy $var = array()cần có

$var = 3;
$var = array();
$var[]  = 2;
print_r($var)

Đầu ra

Array
(
    [0] => 2
)

-1

Đồng ý với @djdy, chỉ có một thay thế mà tôi muốn đăng:

<?php

// Passed array is empty, so we'll never have $items variable available.
foreach (array() AS $item)
    $items[] = $item;

isset($items) OR $items = array(); // Declare $items variable if it doesn't exist

?>

Mục đích của tất cả những điều này là gì? Có vẻ như nhiều lời khuyên về nghĩa đen là không có gì.
BoltClock

Thay vì khai báo trước biến $ items, bạn sẽ kiểm tra sự tồn tại của một vòng lặp, vậy thôi.
Otar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.