2009-06-15 23 views
5

Câu hỏi nhanh. Có một sự khác biệt giữaSự thật PHP & sự khác biệt 'thực sự'

$success = true; 

$success = 'true'; 

Tôi biết họ không phải là '==' với nhau, nhưng có một sự khác biệt trong việc sử dụng chúng?

EDIT: Tôi thấy rằng sử dụng '===' thay vì '==' khi nhìn thấy nếu $ thành công là sai giải quyết vấn đề của tôi. Câu hỏi của tôi bây giờ là, tôi chỉ nên sử dụng dây trong một trường hợp như dưới đây, và gắn bó với '=='?

$User->ProcessLogin(); 
$loginsuccess = $User->ProcessLogin(); 

if ($loginsuccess == true) {  
    echo "<big>Success<big><br />"; 
     echo "<p>We are now redirecting you to the member area.</p>"; 
     echo "<meta http-equiv='refresh' content='=2;MyAccountNEW.php' />"; 
} 
elseif ($loginsuccess == false) { 
     echo "<span class='sorry'><b>Sorry, your account could not be found.</span></b><div id='shopperlogin'> <img class='shopperlogintext' src='images/shopperlogin.png'> 

    <br /> 

    <form method='post' action='loginNEW.php' name='loginform' id='loginform'> 
    <fieldset> 
     <label for='username'>Username:</label><input type='text' name='username' id='username' /><br /> 
     <label for='password'>Password:</label><input type='password' name='password' id='password' /><br /> 
     <input type='submit' name='login' id='login' value='Login' /> 
    </fieldset> 
    </form></div>"; 
    } 

Dưới đây là một phần của lớp ..

function ProcessLogin() { 
    if (!empty($_POST['username']) && !empty($_POST['password'])) { 
      $username = mysql_real_escape_string($_POST['username']); 
      $password = md5(mysql_real_escape_string($_POST['password'])); 
      $checklogin = mysql_query("SELECT * FROM users WHERE Username = '".$username."' AND Password = '".$password."'"); 

       if(mysql_num_rows($checklogin) == 1) 
       { 
        $row = mysql_fetch_array($checklogin); 
        $email = $row['EmailAddress']; 

        $_SESSION['Username'] = $username; 
        $_SESSION['EmailAddress'] = $email; 
        $_SESSION['LoggedIn'] = 1; 
        $this->loggedin = true; 
        $success = true; 
       } 
       else { 
        $success = false; 
       } 
       return $success; 
      } 
     } 
+0

Bạn có thể giữ nó đơn giản hơn rất nhiều vì bạn chỉ quan tâm đến việc cài đặt nhật ký có được đặt hay không, và nó không quan trọng nó được đặt là gì. Biến $ loginsuccess sẽ luôn luôn trống theo mặc định, trừ khi một cái gì đó (bất kỳ) được trả về. Vì vậy, trong hàm ProcessLogin(), chỉ cần "trả về true"; thay vì sử dụng biến $ thành công. Sau đó kiểm tra: if ($ loginsuccess) {// tuyệt vời, nó hoạt động} else {// fail}.Nó cũng tốt nhất để sử dụng hình thức ban đầu, thay vì xuất ra cùng một hình thức trên không với mã trùng lặp. Sau đó, khi cần phải thay đổi một cái gì đó, bạn chỉ cần sửa hình thức ban đầu/đơn. – Alec

Trả lời

0

đúng là một boolean, 'true' là một chuỗi.

4

Đầu tiên là boolean. 2nd là một chuỗi

Bạn có thể thấy sự khác biệt của chúng với điều này.

$success = 'true'; 
$success2 = true; 

var_dump($success); 
var_dump($success2); 

Và cũng kiểm tra kết quả từ này

var_dump($success == $success2); 
var_dump($success === $success2); 

Bạn cũng nên nghiên cứu this type comparison table. thông tin gọn gàng Real và giúp bạn hiểu PHP hơn một chút.

+0

Đối diện có thể? :) – Svish

+0

Rất tiếc, xin lỗi. Đã sửa lỗi –

+0

Tôi cũng nghi ngờ mạnh mẽ rằng việc so sánh == bằng cách sử dụng chuỗi chậm hơn khi bạn phải so sánh toàn bộ chuỗi. Vì vậy, đó cũng là một sự khác biệt. – cgp

13

Bất kỳ chuỗi không trống nào đều được đánh giá là đúng và chuỗi rỗng đánh giá là sai. Các kịch bản sau đây có thể làm sáng tỏ cho bạn:

<?php 
if('true' == true) { 
    echo "'true' == true"; 
} else { 
    echo "'true' != true"; 
} 

echo '<br />'; 

if('false' == true) { 
    echo "'false' == true"; 
} else { 
    echo "'false' != true"; 
} 

echo '<br />'; 

if('foo' == true) { 
    echo "'foo' == true"; 
} else { 
    echo "'foo' != true"; 
} 

echo '<br />'; 

if('false' == false) { 
    echo "'false' == false"; 
} else { 
    echo "'false' != false"; 
} 

echo '<br />'; 

if('' == true) { 
    echo "'' == true"; 
} else { 
    echo "'' != true"; 
} 

echo '<br />'; 

if('' == false) { 
    echo "'' == false"; 
} else { 
    echo "'' != false"; 
} 

?> 

Đây là kết quả:

'true' == true 
'false' == true 
'foo' == true 
'false' != false 
'' != true 
'' == false 

Theo yêu cầu, sau đây là một số ví dụ so sánh == với === cho các giá trị khác nhau.

<?php 
echo "<b>'true' vs. true</b><br />"; 

if('true' == true) { 
    echo "'true' == true<br />"; 
} else { 
    echo "'true' != true<br />"; 
} 

if('true' === true) { 
    echo "'true' === true<br />"; 
} else { 
    echo "'true' !== true<br />"; 
} 

echo "<br /><b>'false' vs. true</b><br />"; 

if('false' == true) { 
    echo "'false' == true<br />"; 
} else { 
    echo "'false' != true<br />"; 
} 

if('false' === true) { 
    echo "'false' === true<br />"; 
} else { 
    echo "'false' !== true<br />"; 
} 

echo "<br /><b>1 vs. true</b><br />"; 

if(1 == true) { 
    echo "1 == true<br />"; 
} else { 
    echo "1 != true<br />"; 
} 

if(1 === true) { 
    echo "1 === true<br />"; 
} else { 
    echo "1 !== true<br />"; 
} 

echo "<br /><b>0 vs. false</b><br />"; 

if(0 == false) { 
    echo "0 == false<br />"; 
} else { 
    echo "0 != false<br />"; 
} 

if(0 === false) { 
    echo "0 === false<br />"; 
} else { 
    echo "0 !== false<br />"; 
} 

echo "<br /><b>1 vs. 'true'</b><br />"; 

if(1 == 'true') { 
    echo "1 == 'true'<br />"; 
} else { 
    echo "1 != 'true'<br />"; 
} 

if(1 === 'true') { 
    echo "1 === 'true'<br />"; 
} else { 
    echo "1 !== 'true'<br />"; 
} 

echo "<br /><b>empty string '' vs. false</b><br />"; 

if('' == false) { 
    echo "'' == false<br />"; 
} else { 
    echo "'' != false<br />"; 
} 

if('' === true) { 
    echo "'' === false<br />"; 
} else { 
    echo "'' !== false<br />"; 
} 

?> 

Output:

'true' vs đúng vs.

'true' == true 
'true' !== true 

'false' true

'false' == true 
'false' !== true 

1 vs đúng

1 == true 
1 !== true 

0 vs sai

0 == false 
0 !== false 

1 vs.'True'

1 != 'true' 
1 !== 'true' 

chuỗi rỗng '' vs sai

'' == false 
'' !== false 
+1

Bạn có thể thêm vào một số ví dụ với === để minh họa toàn diện hơn không? –

+0

Ví dụ được thêm theo yêu cầu, hãy cho tôi biết nếu có bất kỳ người nào khác mà bạn muốn xem một cách rõ ràng. – defines

1

tôi luôn luôn cố gắng sử dụng hạn chế hơn === hoặc !== khi tôi hoàn toàn tích cực cần một câu trả lời boolean, vì vậy:

$success = 'true'; 
if($success === 'false'){ 
... 
} 

Chỉ trong trường hợp.

+0

Ví dụ này không kiểm tra sai boolean, nó kiểm tra một chuỗi là 'false'. – defines

0

Có, có sự khác biệt. Mọi giá trị trong một biến PHP (hoặc hầu như bất kỳ ngôn ngữ lập trình nào) đều có một "kiểu". Khi tạo/gán một giá trị với dấu ngoặc kép,

$foo = 'true'; 

bạn đang tạo một giá trị có loại là một chuỗi, và khi tạo/gán một giá trị mà không có dấu ngoặc kép, bạn đang tạo một biến có kiểu là boolean

$bar = true; 

Giống như một số ngôn ngữ hiện đại, năng động khác, PHP cố gắng thực sự khó khăn để sắp xếp mọi thứ theo cách mà bạn không phải lo lắng về những thứ như loại. Ví dụ, rất nhiều ngôn ngữ sẽ không cho phép bạn so sánh sự bình đẳng giữa hai biến nếu họ không cùng loại, vì vậy cái gì đó như

if('true' == True) ... 

không phải là mã hợp lệ trong python (bạn sẽ nhận được ngoại lệ). PHP, mặt khác, cố gắng để được tốt đẹp và (đằng sau hậu trường) nói "tốt, nếu bạn sử dụng bất kỳ chuỗi trong một hoạt động bình đẳng, chúng tôi sẽ giả vờ chuỗi là loại boolean và đúng, trừ khi nó là một chiều dài bằng không chuỗi". Đó là lý do tại sao, 90% thời gian, bạn có thể nhận được ngay với làm một trong hai.

Tuy nhiên, có sự khác biệt. Để bắt đầu với pedantic, máy tính mà PHP đang chạy trên cần phải đặt sang một bên bộ nhớ nhiều hơn cho một chuỗi hơn nó cho một boolean. Trong ngày và tuổi tác đó là một số lượng nhỏ, nhưng không lãng phí/không muốn.

Quan trọng hơn mặc dù, có những lúc mà sự ép buộc kiểu PHP làm những điều kỳ lạ không có ý nghĩa. Ví dụ, hãy xem xét những điều sau

if ("false" == false) { 
    echo "true\n"; 
} else { 
    echo "false\n"; 
} 

Tuyên bố này sẽ echo "false", mặc dù trực giác bạn muốn điều nó sẽ echo đúng, vì "true" == true đánh giá là đúng. Có rất nhiều trường hợp cạnh như thế này, nơi PHP sẽ hành động theo những cách có vẻ kỳ lạ. Vì vậy, trong việc cố gắng làm cho trường hợp chung đơn giản hơn (hãy chuyển đổi biến cho mọi người), họ đã làm cho một số trường hợp ít phổ biến hơn phức tạp hơn, điều này có thể dẫn đến khó theo dõi lỗi. Mọi thứ trở nên thực sự gnarly khi một số người trong nhóm của bạn hiểu được sự ép buộc đằng sau hậu trường, và những người khác thì không.

Vì vậy, to và lớn, cách tốt nhất là trả về các phép toán rõ ràng (không có dấu ngoặc kép) từ các phương thức và hàm đang trả về thành công. Các lập trình viên có kinh nghiệm mong đợi nó và những lập trình viên thiếu kinh nghiệm sẽ bị bối rối bởi một số lỗi mà pop-up khi các chuỗi được sử dụng thay thế.

Các vấn đề liên quan