Làm thế nào để tránh được cung cấp thông tin mới cho hàm bàn phím (Isset () và trống ()


98

Tôi có một số ứng dụng cũ hơn đưa ra rất nhiều thông báo "xyz là không xác định" và "bù đắp không xác định" khi chạy ở mức lỗi E_NOTICE, vì sự tồn tại của các biến không được kiểm tra rõ ràng bằng cách sử dụng isset()và phối hợp.

Tôi đang xem xét làm việc thông qua chúng để làm cho chúng tương thích với E_NOTICE, vì các thông báo về việc thiếu các biến hoặc hiệu số có thể là cứu cánh, có thể có một số cải tiến hiệu suất nhỏ cần đạt được và nhìn chung đó là cách rõ ràng hơn.

Tuy nhiên, tôi không thích những gì gây ra hàng trăm isset() empty()array_key_exists()s làm cho mã của tôi. Nó trở nên cồng kềnh, trở nên ít đọc hơn, mà không đạt được bất cứ điều gì về giá trị hoặc ý nghĩa.

Làm cách nào tôi có thể cấu trúc mã của mình mà không có quá nhiều kiểm tra biến, đồng thời tương thích với E_NOTICE?


6
Tôi hoàn toàn đồng ý. Đó là lý do tại sao tôi rất thích Zend Framework, mô-đun yêu cầu ở đó rất tốt. Nếu tôi đang làm việc trên một số ứng dụng nhỏ, tôi thường viết mã một số lớp yêu cầu đơn giản bằng các phương thức ma thuật __set và __get hoạt động tương tự như yêu cầu của ZF. Bằng cách đó, tôi tránh tất cả các lần xuất hiện của Isset và trống trong mã của mình. Theo cách đó, tất cả những gì bạn cần sử dụng là if (count ($ arr)> 0) trên các mảng trước khi lặp qua chúng và if (null! == $ biến) ở một vài vị trí quan trọng. Nó trông sạch sẽ hơn nhiều.
Richard Knop

Câu trả lời:


128

Đối với những người quan tâm, tôi đã mở rộng chủ đề này thành một bài viết nhỏ, cung cấp thông tin dưới đây ở dạng có cấu trúc tốt hơn một chút: Hướng dẫn cuối cùng cho Isset của PHP


IMHO, bạn nên nghĩ đến việc không chỉ làm cho ứng dụng "tương thích với E_NOTICE" mà còn phải cơ cấu lại toàn bộ. Có hàng trăm điểm trong mã của bạn thường xuyên cố gắng sử dụng các biến không tồn tại nghe có vẻ giống như một chương trình có cấu trúc khá tồi. Việc cố gắng truy cập các biến không tồn tại sẽ không bao giờ xảy ra, các ngôn ngữ khác gặp khó khăn tại thời điểm biên dịch. Thực tế là PHP cho phép bạn làm điều đó không có nghĩa là bạn nên làm như vậy.

Những cảnh báo này là để giúp bạn, không làm phiền bạn. Nếu bạn nhận được cảnh báo "Bạn đang cố gắng làm việc với thứ không tồn tại!" , phản ứng của bạn sẽ là "Rất tiếc, lỗi của tôi, hãy để tôi sửa lỗi đó càng sớm càng tốt." Làm thế nào khác bạn sẽ phân biệt sự khác biệt giữa "các biến hoạt động tốt không xác định"mã sai trung thực có thể dẫn đến lỗi nghiêm trọng ? Đây cũng là lý do tại sao bạn luôn, luôn luôn phát triển với báo cáo lỗi được chuyển thành 11 và tiếp tục cắm đầu vào mã của bạn cho đến khi không còn một lỗi nàoNOTICEđược phát hành. Việc tắt báo cáo lỗi chỉ dành cho môi trường sản xuất, để tránh rò rỉ thông tin và cung cấp trải nghiệm người dùng tốt hơn ngay cả khi đối mặt với mã lỗi.


Để giải thích:

Bạn sẽ luôn cần issethoặc emptyở đâu đó trong mã của mình, cách duy nhất để giảm sự xuất hiện của chúng là khởi tạo các biến của bạn đúng cách. Tùy thuộc vào tình huống, có những cách khác nhau để làm điều đó:

Đối số hàm:

function foo ($bar, $baz = null) { ... }

Không cần để kiểm tra xem $barhoặc $bazđược thiết lập bên trong hàm vì bạn chỉ cần cài đặt chúng, tất cả các bạn cần phải lo lắng về là nếu đánh giá lại giá trị của mình để truehoặc false(hoặc bất kỳ người nào khác).

Các biến chính quy ở bất kỳ đâu:

$foo = null;
$bar = $baz = 'default value';

Khởi tạo các biến của bạn ở đầu khối mã mà bạn sẽ sử dụng chúng. Điều này giải quyết !issetvấn đề, đảm bảo rằng các biến của bạn luôn có giá trị mặc định đã biết, cung cấp cho người đọc ý tưởng về những gì mã sau sẽ hoạt động và do đó cũng đóng vai trò như một loại tài liệu tự học.

Mảng:

$defaults = array('foo' => false, 'bar' => true, 'baz' => 'default value');
$values = array_merge($defaults, $incoming_array);

Tương tự như trên, bạn đang khởi tạo mảng với các giá trị mặc định và ghi đè chúng bằng các giá trị thực.

Trong các trường hợp còn lại, giả sử một mẫu mà bạn đang xuất ra các giá trị có thể được đặt bởi bộ điều khiển, bạn sẽ chỉ phải kiểm tra:

<table>
    <?php if (!empty($foo) && is_array($foo)) : ?>
        <?php foreach ($foo as $bar) : ?>
            <tr>...</tr>
        <?php endforeach; ?>
    <?php else : ?>
        <tr><td>No Foo!</td></tr>
    <?php endif; ?>
</table>

Nếu bạn thấy mình thường xuyên sử dụng array_key_exists, bạn nên đánh giá xem bạn đang sử dụng nó để làm gì. Lần duy nhất nó tạo ra sự khác biệt là ở đây:

$array = array('key' => null);
isset($array['key']); // false
array_key_exists('key', $array); // true

Như đã nêu ở trên, nếu bạn đang khởi tạo đúng cách các biến của mình, bạn không cần phải kiểm tra xem khóa có tồn tại hay không, bởi vì bạn biết nó có. Nếu bạn nhận được các mảng từ một nguồn bên ngoài, giá trị sẽ hầu như không thể nullnhưng '', 0, '0', falsehoặc một cái gì đó giống như nó, tức là một giá trị mà bạn có thể đánh giá bằng issethoặc empty, tùy thuộc vào ý định của bạn. Nếu bạn thường xuyên đặt một khóa mảng nullvà muốn nó có ý nghĩa gì khác false, nhưng nếu trong ví dụ trên, các kết quả khác nhau issetarray_key_existstạo ra sự khác biệt cho logic chương trình của bạn, bạn nên tự hỏi tại sao. Sự tồn tại đơn thuần của một biến không nên quan trọng, chỉ giá trị của nó mới là hệ quả. Nếu khóa là một cờ true/ false, thì hãy sử dụngtruehoặc false, không null. Ngoại lệ duy nhất cho điều này sẽ là các thư viện của bên thứ 3 muốn nullcó ý nghĩa gì đó, nhưng vì nullrất khó phát hiện trong PHP nên tôi vẫn chưa tìm thấy bất kỳ thư viện nào thực hiện điều này.


4
Đúng, nhưng hầu hết các nỗ lực truy cập không thành công đều xảy ra dọc theo if ($array["xyz"])thay vì isset()hoặc array_key_exists()mà tôi thấy phần nào hợp pháp, chắc chắn không phải các vấn đề về cấu trúc (hãy sửa cho tôi nếu tôi nhầm lẫn). Thêm vào array_key_exists()chỉ trông giống như một sự lãng phí khủng khiếp đối với tôi.
Pekka

9
Tôi không thể nghĩ ra bất kỳ trường hợp nào mà tôi sẽ sử dụng array_key_existsthay vì đơn giản isset($array['key'])hoặc !empty($array['key']). Chắc chắn, cả hai đều thêm 7 hoặc 8 ký tự vào mã của bạn, nhưng tôi khó gọi đó là vấn đề. Nó cũng giúp làm rõ mã của bạn: if (isset($array['key']))có nghĩa là biến này thực sự là tùy chọn và có thể không có, trong khi if ($array['key'])chỉ có nghĩa là "nếu đúng". Nếu bạn nhận được thông báo cho thông báo thứ hai, bạn biết logic của bạn bị sai ở đâu đó.
lừa đảo

6
Tôi tin rằng sự khác biệt giữa Isset () và array_key_exists () là cái sau sẽ trả về true nếu giá trị là NULL. Isset () sẽ không.
Htbaa

1
Đúng, nhưng tôi không thể nghĩ ra một trường hợp sử dụng lành mạnh mà tôi cần phân biệt giữa biến không tồn tại và giá trị whos của khóa đã đặt là null. Nếu giá trị đánh giá là FALSE thì sự phân biệt phải không có sự khác biệt. :)
dối trá

1
Các khóa mảng chắc chắn khó chịu hơn các biến không xác định. Nhưng nếu bạn không chắc một mảng có chứa khóa hay không, điều đó có nghĩa bạn đã không tự xác định mảng hoặc bạn đang lấy nó từ một nguồn mà bạn không kiểm soát. Không có kịch bản nào nên xảy ra thường xuyên; và nếu nó xảy ra, bạn có mọi lý do để kiểm tra xem mảng có chứa những gì bạn nghĩ hay không. Đó là một biện pháp bảo mật IMO.
kijin

37

Chỉ cần viết một hàm cho điều đó. Cái gì đó như:

function get_string($array, $index, $default = null) {
    if (isset($array[$index]) && strlen($value = trim($array[$index])) > 0) {
        return get_magic_quotes_gpc() ? stripslashes($value) : $value;
    } else {
        return $default;
    }
}

mà bạn có thể sử dụng như

$username = get_string($_POST, 'username');

Làm tương tự cho các công cụ tầm thường như get_number(), get_boolean(), get_array()và vân vân.


5
Điều này có vẻ tốt, và kiểm tra magic_quotes. Đẹp!
Pekka

Chức năng tuyệt vời! Cảm ơn rất nhiều vì đã chia sẻ.
Mike Moore

3
Lưu ý rằng $ _POST ['something'] có thể trả về mảng, ví dụ: đầu vào với <input name="something[]" />. Điều này sẽ gây ra lỗi (vì không thể áp dụng trim cho các mảng) khi sử dụng mã trên, trong trường hợp này, người ta nên sử dụng is_stringvà có thể strval. Đây không chỉ đơn giản là một trường hợp mà người ta nên sử dụng get_arrayvì đầu vào của người dùng (độc hại) có thể bất cứ thứ gì và trình phân tích cú pháp đầu vào của người dùng sẽ không bao giờ gặp lỗi.
Ciantic

1
Tôi sử dụng cùng một loại hàm nhưng được định nghĩa như sau: function get_value (& $ item, $ default = NULL) {return evalet ($ item)? $ item: $ default; } Ưu điểm của hàm này là bạn có thể gọi nó với các mảng, biến và đối tượng. Hạn chế là $ item sẽ được khởi tạo (thành null) sau đó nếu không.
Mat

Bạn nên tắt báo giá ma thuật trên toàn cầu, thay vì xử lý chúng trong 1 chức năng. Có rất nhiều nguồn trên internet giải thích các câu trích dẫn ma thuật.
Kayla

13

Tôi tin rằng một trong những cách tốt nhất để đối phó với vấn đề này là truy cập các giá trị của mảng GET và POST (COOKIE, SESSION, v.v.) thông qua một lớp.

Tạo một lớp cho mỗi mảng đó và khai báo __get__setcác phương thức ( nạp chồng ). __getchấp nhận một đối số sẽ là tên của một giá trị. Phương thức này nên kiểm tra giá trị này trong mảng toàn cục tương ứng, bằng cách sử dụng isset()hoặc empty()và trả về giá trị nếu nó tồn tại hoặc null(hoặc một số giá trị mặc định khác) nếu không.

Sau đó, bạn có thể tự tin truy cập các giá trị mảng theo cách này: $POST->usernamevà thực hiện bất kỳ xác thực nào nếu cần mà không sử dụng bất kỳ isset()s hoặc empty()s nào. Nếu usernamekhông tồn tại trong mảng toàn cục tương ứng thì nullsẽ được trả về, do đó sẽ không có cảnh báo hoặc thông báo nào được tạo ra.


1
Đây là một ý tưởng tuyệt vời và tôi đã sẵn sàng để tái cấu trúc mã. +1
Pekka

Thật không may, bạn sẽ không thể làm cho các trường hợp đó trở nên siêu cấp trừ khi bạn gán chúng cho $ _GET hoặc $ _POST, điều này sẽ khá xấu. Nhưng bạn có thể sử dụng các lớp tĩnh tất nhiên ...
ThiefMaster

1
Bạn không thể sử dụng getters và setters trên "lớp tĩnh". và việc viết một lớp cho mỗi biến là một cách làm không tốt vì nó ám chỉ sự trùng lặp mã, điều này là không tốt. Tôi không nghĩ rằng giải pháp này là đầy đủ nhất.
Mat

Một thành viên tĩnh công khai của một lớp hoạt động giống như một superglobal, tức là: HTTP :: $ POST-> tên người dùng, nơi bạn khởi tạo HTTP :: $ POST vào một thời điểm nào đó trước khi sử dụng, tức là. Lớp HTTP {public static $ POST = array (); ...}; HTTP :: $ POST = new someClass ($ _ POST); ...
khóa dán

6

Tôi không phiền khi sử dụng array_key_exists()hàm. Trên thực tế, tôi thích sử dụng chức năng cụ thể này hơn là dựa vào các chức năng hack có thể thay đổi hành vi của chúng trong tương lai như emptyisset (gạch đầu dòng để tránh tính nhạy cảm ).


Tuy nhiên, tôi sử dụng một hàm đơn giản có ích trong việc này và một số tình huống khác trong việc xử lý các chỉ mục mảng :

function Value($array, $key, $default = false)
{
    if (is_array($array) === true)
    {
        settype($key, 'array');

        foreach ($key as $value)
        {
            if (array_key_exists($value, $array) === false)
            {
                return $default;
            }

            $array = $array[$value];
        }

        return $array;
    }

    return $default;
}

Giả sử bạn có các mảng sau:

$arr1 = array
(
    'xyz' => 'value'
);

$arr2 = array
(
    'x' => array
    (
        'y' => array
        (
            'z' => 'value',
        ),
    ),
);

Làm thế nào để bạn lấy "giá trị" ra khỏi các mảng? Đơn giản:

Value($arr1, 'xyz', 'returns this if the index does not exist');
Value($arr2, array('x', 'y', 'z'), 'returns this if the index does not exist');

Chúng ta đã có các mảng đơn chiều và đa chiều, chúng ta có thể làm gì khác?


Lấy ví dụ đoạn mã sau:

$url = '/programming/1960509';
$domain = parse_url($url);

if (is_array($domain) === true)
{
    if (array_key_exists('host', $domain) === true)
    {
        $domain = $domain['host'];
    }

    else
    {
        $domain = 'N/A';
    }
}
else
{
    $domain = 'N/A';
}

Khá nhàm chán phải không? Đây là một cách tiếp cận khác sử dụng Value()hàm:

$url = '/programming/1960509';
$domain = Value(parse_url($url), 'host', 'N/A');

Như một ví dụ bổ sung, hãy lấy RealIP()hàm để kiểm tra:

$ip = Value($_SERVER, 'HTTP_CLIENT_IP', Value($_SERVER, 'HTTP_X_FORWARDED_FOR', Value($_SERVER, 'REMOTE_ADDR')));

Gọn gàng hả? ;)


6
"Dựa vào các chức năng hack có thể thay đổi hành vi của họ trong tương lai" ?! Xin lỗi, nhưng đó là điều nực cười nhất mà tôi đã nghe suốt cả tuần. Trước hết, issetemptycấu trúc ngôn ngữ , không phải hàm. Thứ hai, nếu bất kỳ cấu trúc ngôn ngữ / hàm thư viện cốt lõi nào thay đổi hành vi của chúng, bạn có thể bị hoặc không. Nếu array_key_existsthay đổi hành vi của nó thì sao? Câu trả lời là nó sẽ không, miễn là bạn đang sử dụng nó như được ghi lại. Và issetđược ghi nhận để sử dụng chính xác như vậy. Các hàm viết hoa xấu nhất không được dùng nữa trong một hoặc hai phiên bản phát hành chính. Hội chứng NIH thật tồi tệ!
dối trá

Tôi xin lỗi vì đã lừa dối, nhưng trước hết bản hack được in nghiêng trong trường hợp bạn không để ý. =) Thứ hai, ý bạn là người ta không nên dựa vào array_key_exists()để kiểm tra xem khóa có tồn tại trong mảng hay không ?! array_key_exists()được tạo ra chính xác cho điều đó , tôi muốn dựa vào nó cho mục đích này hơn là isset()và đặc biệt empty()mô tả chính thức của nó là: "xác định xem một biến có trống không", không đề cập đến bất cứ điều gì nếu nó thực sự tồn tại. Bình luận và bỏ phiếu của bạn là một trong những điều nực cười nhất mà tôi đã chứng kiến ​​cả tháng .
Alix Axel

3
Tôi đang nói issetemptykhông đáng tin cậy hơn array_key_existsvà có thể làm công việc chính xác như vậy. Ví dụ dài dòng thứ hai của bạn có thể được viết như $domain = isset($domain['host']) ? $domain['host'] : 'N/A';chỉ với các tính năng ngôn ngữ cốt lõi, không cần lệnh gọi chức năng bổ sung hoặc khai báo (lưu ý rằng tôi không nhất thiết ủng hộ việc sử dụng toán tử bậc ba; o)). Đối với các biến vô hướng thông thường, bạn sẽ vẫn cần sử dụng issethoặc emptyvà bạn có thể sử dụng chúng cho các mảng theo cùng một cách. "Độ tin cậy" là một lý do tồi tệ để không làm như vậy.
dối trá

1
Bạn đã đưa ra quan điểm của mình, mặc dù tôi không đồng ý với hầu hết những điều bạn nói. Tôi nghĩ rằng bạn đã hiểu sai trong 90% + trường hợp, ví dụ: tôi sử dụng giá trị "0" trong các trường ẩn trong biểu mẫu mọi lúc. Tôi vẫn tin rằng giải pháp tôi đã cung cấp không đáng bị bỏ phiếu và có thể có ích cho Pekka.
Alix Axel

2
Trong khi @deceze có một điểm với các chức năng tùy chỉnh - tôi thường có cùng quan điểm - cách tiếp cận value () trông đủ thú vị để tôi sẽ xem xét nó. Tôi nghĩ câu trả lời và phần tiếp theo sẽ cho phép tất cả những người tình cờ gặp nó sau này có thể tự quyết định. +1.
Pekka

3

Tôi ở đây với bạn. Nhưng các nhà thiết kế PHP đã mắc phải nhiều sai lầm tồi tệ hơn thế. Không có bất kỳ cách nào để xác định một hàm tùy chỉnh cho bất kỳ việc đọc giá trị nào, không có bất kỳ cách nào xung quanh nó.


1
thứ Isset (). Làm cho mọi thứ vô hiệu theo mặc định sẽ tiết kiệm rất nhiều rắc rối.
vava

2
Và đây là 'mọi thứ' là gì? Có vẻ như lãng phí đối với PHP khi phải tưởng tượng mọi tên biến có thể hình dung và đặt mỗi tên thành NULL để một nhà phát triển lười biếng có thể tránh nhập 5 ký tự.
Lotus Notes

5
@Byron, nhìn này, nó thực sự đơn giản, rất nhiều ngôn ngữ khác làm được điều đó, Ruby và Perl là một vài ví dụ. VM biết nếu biến đã được sử dụng trước đó hay không, phải không? Nó luôn có thể trả về null thay vì không thành công có hoặc không có thông báo lỗi. Và đây không phải là về 5 ký tự tệ hại, mà là viết params["width"] = params["width"] || 5để đặt giá trị mặc định thay vì tất cả những điều vô nghĩa với isset()các cuộc gọi.
vava

3
Xin lỗi vì đã phục hồi một chủ đề cũ. Hai trong số những sai lầm tồi tệ nhất của PHP là register_globalsmagic_quotes. Các vấn đề thúc đẩy này làm cho các biến chưa được khởi tạo trông gần như vô hại khi so sánh.
staticsan

3

Tôi sử dụng các chức năng này

function load(&$var) { return isset($var) ? $var : null; }
function POST($var) { return isset($_POST[$var]) ? $_POST[$var] : null; }

Ví dụ

$y = load($x); // null, no notice

// this attitude is both readable and comfortable
if($login=POST("login") and $pass=POST("pass")) { // really =, not ==
  // executes only if both login and pass were in POST
  // stored in $login and $pass variables
  $authorized = $login=="root" && md5($pass)=="f65b2a087755c68586568531ad8288b4";
}

2
Tôi cũng sử dụng điều này nhưng hãy nhớ rằng trong một số trường hợp, các biến của bạn sẽ được khởi tạo tự động: ví dụ: load ($ array ['FOO']) sẽ tạo một khóa FOO trong $ array.
Mat

2

Chào mừng bạn đến với toán tử liên kết null (PHP> = 7.0.1):

$field = $_GET['field'] ?? null;

PHP nói:

Toán tử liên kết null (??) đã được thêm vào dưới dạng đường cú pháp cho trường hợp phổ biến là cần sử dụng một số ba kết hợp với Isset (). Nó trả về toán hạng đầu tiên nếu nó tồn tại và không phải là NULL; nếu không thì nó trả về toán hạng thứ hai của nó.


1

Tạo một hàm trả về falsenếu không được đặt và nếu được chỉ định, falsenếu trống. Nếu hợp lệ, nó trả về biến. Bạn có thể thêm các tùy chọn khác như được thấy trong mã bên dưới:

<?php
function isset_globals($method, $name, $option = "") {
    if (isset($method[$name])) {    // Check if such a variable
        if ($option === "empty" && empty($method[$name])) { return false; } // Check if empty 
        if ($option === "stringLength" && strlen($method[$name])) { return strlen($method[$name]); }    // Check length of string -- used when checking length of textareas
        return ($method[$name]);
    } else { return false; }
}

if (!isset_globals("$_post", "input_name", "empty")) {
    echo "invalid";
} else {
    /* You are safe to access the variable without worrying about errors! */
    echo "you uploaded: " . $_POST["input_name"];
}
?>

0

Phần mềm không chạy một cách kỳ diệu bởi ân điển của chúa. Nếu bạn đang mong đợi điều gì đó bị thiếu, bạn cần phải xử lý đúng cách.

Nếu bạn bỏ qua nó, có thể bạn đang tạo ra các lỗ hổng bảo mật trong các ứng dụng của mình. Trong các ngôn ngữ tĩnh, việc truy cập một biến không xác định là không thể. Nó sẽ không chỉ đơn giản là biên dịch hoặc làm hỏng ứng dụng của bạn nếu nó rỗng.

Hơn nữa, nó làm cho ứng dụng của bạn không thể xác minh được và bạn sẽ phát điên khi có những điều không mong muốn xảy ra. Nghiêm ngặt về ngôn ngữ là điều bắt buộc và PHP, theo thiết kế, là sai lầm trong nhiều khía cạnh. Nó sẽ khiến bạn trở thành một lập trình viên tồi nếu bạn không ý thức được.


Tôi nhận thức rõ những thiếu sót của PHP. Như tôi đã chỉ ra trong câu hỏi, tôi đang nói về việc đại tu các dự án cũ.
Pekka

Đã đồng ý. Là một nhà phát triển PHP lâu năm, thật khó để tôi có thể dấn thân vào các ngôn ngữ mới như Java, nơi bạn cần phải khai báo mọi thứ.
Dzhuneyt

0

Tôi không chắc định nghĩa của bạn về khả năng đọc là gì, nhưng việc sử dụng thích hợp các khối trống (), evalet () và try / ném / bắt, là khá quan trọng đối với toàn bộ quá trình.

Nếu E_NOTICE của bạn đến từ $ _GET hoặc $ _POST, thì chúng phải được kiểm tra với trống () ngay cùng với tất cả các kiểm tra bảo mật khác mà dữ liệu đó phải vượt qua.

Nếu nó đến từ các nguồn cấp dữ liệu hoặc thư viện bên ngoài, nó nên được gói trong try / catch.

Nếu nó đến từ cơ sở dữ liệu, $ db_num_rows () hoặc tương đương của nó sẽ được kiểm tra.

Nếu nó đến từ các biến nội bộ, chúng phải được khởi tạo đúng cách. Thông thường, những loại thông báo này đến từ việc gán một biến mới cho việc trả về một hàm trả về FALSE khi bị lỗi. Chúng phải được bao bọc trong một bài kiểm tra, trong trường hợp không thành công, có thể gán cho biến một giá trị mặc định có thể chấp nhận được mà mã có thể xử lý hoặc đưa ra một ngoại lệ mà mã có thể xử lý.

Những điều này làm cho mã dài hơn, thêm khối bổ sung và thêm các bài kiểm tra bổ sung, nhưng tôi không đồng ý với bạn ở điểm tôi nghĩ rằng chúng chắc chắn thêm giá trị bổ sung.


-2

Còn việc sử dụng @toán tử?

Ví dụ:

if(@$foo) { /* Do something */ }

Bạn có thể nói điều này là tệ vì bạn không kiểm soát được những gì xảy ra "bên trong" $ foo (ví dụ: nếu đó là một lệnh gọi hàm chứa lỗi PHP), nhưng nếu bạn chỉ sử dụng kỹ thuật này cho các biến, điều này tương đương với:

if(isset($foo) && $foo) { /* ... */ }

if(isset($foo))thực sự là đủ. Nó sẽ trả về TRUEnếu biểu thức đánh giá là TRUE.
Dzhuneyt

2
@ ColorWP.com nó cũng sẽ trả về true nếu biểu thức đánh giá là false.
Jon Hulka

Bạn chỉ nên sử dụng tham số @ (để bỏ qua thông báo) trên mã không thực sự được phát triển thêm hoặc trên mã một lần hoặc bản sửa lỗi nhanh trên các dự án hiện có mà bạn không muốn cho bất kỳ ai khác xem. Nhưng đó là một cách giải quyết phổ biến để hack nhanh chóng.
rubo77
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.