2013-07-03 26 views
6

Tôi hiểu rằng PHP là ngôn ngữ được đánh máy yếu. Câu hỏi của tôi là: về sự cân bằng, có nên khởi tạo các biến trong PHP như các loại cụ thể, liên quan đến các mối quan tâm về bảo mật và hiệu quả không? Hay điều này sẽ bơi lội không cần thiết chống lại thủy triều?Loại truyền bằng PHP - bảo mật và hiệu quả

Ví dụ về initialisations cụ thể:

$name = (string) "PHP"; // string 
$pizzaToppings = array("tomato", "cheese", "pepperoni"); // array 
$angle = (integer) 60; // integer 

Bài viết sau đây đã giúp, nhưng không trả lời, câu hỏi của tôi: PHP Typecasting - Good or bad?

Trả lời

4

PHP luôn cần phải biết "loại hiện tại" của một giá trị trước khi nó có thể sử dụng nó cho mục đích nào, bao gồm khởi tạo một biến. "Loại hiện tại" là siêu dữ liệu (một liệt kê) đi cùng với tất cả các giá trị.

Trong ví dụ mã của bạn dàn diễn viên là vô nghĩa bởi vì bạn đang khởi tạo các biến sử dụng các giá trị văn chương, đó là luôn luôn loại rõ ràng:

$s = "foo"; 
echo is_string($s); // 1 

$s = (string)"foo"; 
echo is_string($s); // also 1 

Cũng vậy với các số nguyên và mảng.

Có ít nhất một trường hợp kiểu của biến sẽ là một cái gì đó khác hơn bạn có thể mong đợi ngay từ cái nhìn đầu tiên:

$i = PHP_INT_MAX + 1; // or use something like 999999999999 
echo gettype($i); // "double"! 

Trong trường hợp này sử dụng một dàn diễn viên sẽ làm cho $i một số nguyên, nhưng nó sẽ cũng thay đổi giá trị của nó:

$i = (int)(PHP_INT_MAX + 1); 
echo gettype($i); // "integer" 
echo $i; // a very large negative number -- what?!? 

Tất nhiên điều này không phải do thiếu diễn viên, mà là một tạo phẩm về cách số được xử lý bằng PHP. Vì vậy, kết luận là rõ ràng: không có điểm trong việc sử dụng phôi khi khởi tạo với các chữ cái.

Nếu bạn đang khởi tạo biến mà bạn dự định sử dụng làm loại X có giá trị Y khác (hoặc loại chưa biết) thì có lý do để sử dụng diễn viên rõ ràng: viết tài liệu theo mã biến sẽ được sử dụng trong tương lai. Nhưng đừng đánh giá quá cao lợi ích: thông tin này chỉ dành cho con người; PHP sẽ tự động thực hiện các chuyển đổi kiểu thông thường bất cứ khi nào bạn cố gắng sử dụng một biến như một kiểu khác với nó.

+0

câu trả lời thực sự tốt đẹp +1 – Robert

0

Bạn không nên lo lắng về các loại, php sẽ làm cho họ khi cần thiết , khi bạn phải sử dụng các loại khi tính toán, hãy xác thực chúng bằng cách sử dụng ba === (loại so sánh cụ thể) mà chúng vẫn hợp lệ khi loại đó truyền đến loại mong muốn khi cần

1 === 1 = true 
1 === "1" = false 
1 === true = false 
true === true = true 
false === false = true 
"hello" === "hello" = true 
etc... 

loại đúc

$numberofpizzas = $_POST['number']; 
$price = 16; 
$totalprice = $price * (int)$numberofpizzas 
+0

Michael, tôi muốn tránh gõ năng động và tránh sự cần thiết để kiểm tra cho loại hình sau. Tôi thích kiểm soát loại bản thân hơn là để điều này cho PHP. Không chắc chắn nếu điều này gây ra tắc nghẽn tuy nhiên. –

+0

để kiểm soát nó thông qua các chữ. PHP không phải là ngôn ngữ mà bạn có thể định nghĩa kiểu biến. Nếu bạn không thích nó di chuyển đến. NET – Robert

2

Theo định nghĩa, nó không hoạt động giống nhau giữa từng loại. Nó được khuyến khích để giữ cùng loại trong suốt vòng đời của chương trình để ngăn chặn các giá trị không chính xác.

$val = false // (int) $val => 0 
$val = 0.0010 // (int) $val => 0 

All types of test methods

+1

Vâng, tôi thích mỗi biến để giữ cho cùng một loại, đó là lý do tại sao tôi đã tuyên bố chúng là loại cụ thể. Tôi muốn tránh gõ động. –

+0

Đây là một thực hành rất tốt. Tuy nhiên, buộc loại biến là không thể trong PHP –

+0

Bạn có phương pháp is_int hoặc is_float để kiểm tra loại trước khi xử lý –

0

Một số hàm trả về kiểu dữ liệu "hỗn hợp", tức là có thể trả về boolean "false" cho lỗi và số nguyên "0" làm giá trị trả về hợp lệ.

Khi kiểm tra giá trị trả lại, đôi khi cần thiết phải sử dụng === tổng hợp để có được kết quả chính xác.

Hãy ví dụ này:

$s = 'Test'; 
$c = strpos($s, 'T'); 
// The letter 'T' is at the first position, at index 0 

if (false == $c) ... // evaluates to "true" because of the weak type comparsion of "0" and "false" 

if (false === $c) ... // evaluates to "false" 
Các vấn đề liên quan