2010-10-28 32 views
9

Tôi chưa thực hiện nhiều chương trình bằng nhiều ngôn ngữ, nhưng tôi biết trong C (++), bạn phải khai báo một loại biến (int, char, v.v.).Làm thế nào để PHP biết loại biến nào nó sử dụng (hay không)?

Trong PHP, tất nhiên, bạn không phải làm điều đó. Bạn có thể bắt đầu với $str = "something"; rồi sau đó $str = array("something" => "smells"); và cô ấy hạnh phúc.

PHP biên dịch như thế nào? Làm thế nào để nó biết loại biến sẽ là gì? Liệu nó có quan tâm không?

Câu hỏi này không liên quan đến bất kỳ điều gì tôi đang làm. Tôi chỉ tò mò thôi.

EDIT.

Tôi cần làm rõ câu hỏi này một chút.

Trong C, nếu tôi nói:

int y; 

Nó bảo lưu lượng x byte cho y. Nếu y tràn, tin xấu.

PHP không có tính chất này (ít nhất là tôi không nghĩ là có).

$i = "a number"; 
$i = 8; 
$i = 1000000000000000000; 

Tất cả đều giống với ngôn ngữ. Làm thế nào để nó biết bao nhiêu để dự trữ? Hay tôi đang so sánh Táo với Cam? Nếu tôi nói về điều này sai, bạn có bất kỳ chủ đề tốt nào mà tôi có thể đọc để hiểu rõ hơn không?

+1

Nó cũng đáng chú ý là có một số ngôn ngữ, chẳng hạn như Haskell, nơi bạn có thể viết một cái gì đó như 'x = f 1000', và nó sẽ * suy ra * kiểu 'x' - tìm ra nó phải là gì, dựa trên kiểu' f', vv. Về biên dịch, nó sẽ trông giống C; về tuyên bố, nó sẽ trông giống PHP hơn. Tất nhiên, PHP hoạt động giống như trò chơi ăn gian. –

Trả lời

6

Vì bạn có C kinh nghiệm, hãy xem xét một biến PHP để được như sau:

typedef struct { 
int varType; 
void* data; 
} variable_t; 

khi bạn tạo một biến mới, nó sẽ tạo ra một variable_t, cung cấp cho nó một thẻ loại (cho phép nói 1 cho int, 2 cho chuỗi) và lưu trữ nó trong danh sách ở đâu đó (theo phạm vi, tham chiếu theo tên). Nội dung thực tế sẽ được lưu trữ trong *data. Khi biến được truy cập lần nữa, loại có thể được xác định từ int varType và hành động thích hợp được thực hiện trên void* data, chẳng hạn như sử dụng biến đó làm int hoặc chuỗi.

Hãy tưởng tượng rằng đoạn mã PHP:

$data = 12; 
$data2 = $data + 1; 
$data = "Hello"; 

tạo hướng dẫn như sau (pseudo-Cish):

Line 1: 
variable_t* var = new_variable(TYPE_INT, data); 
store_variable("data", var); 

Line 2: 
variable_t* var = get_variable("data2"); 
if (var->varType == TYPE_INT) 
    int value = 1 + *(int*)var->data); 
else 
    error("Can't add non int"); 
var = new_variable(TYPE_INT, value); 
store_variable("data2", var); 

Line 3: 
variable_t* var = get_variable("data"); 
if (var) 
    destroy_variable(var); 
// Do like line 1, but for TYPE_STRING 

Đây là loại dữ liệu Augmented làm việc trong bytecoded, biên soạn, hoặc trực tiếp ngôn ngữ thông dịch .

Có nhiều chi tiết liên quan đến việc triển khai máy ảo khác nhau (phân bổ cục bộ, phân bổ đống, máy ảo đăng ký, v.v.). Nếu bạn thực sự muốn hiểu cách các máy ảo hoạt động, tham chiếu tốt nhất là Lua. Rất sạch sẽ ngôn ngữ, bytecode rất sạch sẽ, và rất sạch sẽ máy ảo. PHP có lẽ là triển khai cuối cùng bạn nên xem xét.

+2

Đây là một câu trả lời tuyệt vời và chính xác những gì tôi đang tìm kiếm. Cảm ơn! – Jason

1

PHP không thực sự biên dịch - nó được diễn giải (thành mã op).

Khá nhiều nếu bạn cố gắng làm điều gì đó trên một loại dữ liệu nhất định không thể thực hiện được, nó sẽ cho bạn một lỗi. Không có loại kiểm tra.

+0

Để xây dựng thêm: bạn có thể sử dụng một số phương pháp nhất định để kiểm tra loại biến trước khi thực hiện các hoạt động nhất định (báo cáo "nếu" chuẩn) để tránh bị lỗi. – KPthunder

+0

Tôi biết tôi có thể sử dụng những thứ như 'is_numeric()' nhưng làm sao anh biết? Làm thế nào là các kiểu dữ liệu tự nhiên theo kịp? Chúng có luôn luôn là chuỗi và 'is_numeric()' đi qua một công tắc trong hàm? Hay nó nhìn vào kích thước. Đó là loại câu trả lời tôi đang tìm kiếm. Làm thế nào để PHP biết bất cứ điều gì bên cạnh đó nó có một biến '$ c' và' $ c = "một cái gì đó"; '? – Jason

+0

Hãy để tôi làm rõ câu hỏi của tôi một chút. – Jason

1

Nó không biên dịch. Đây là một số interpreted language, như Javascript.

+0

Thậm chí JS có thể không hài lòng nếu tôi làm điều gì đó cho một biến chưa được khai báo. Liệu PHP có tự động khai báo nó nếu nó chưa được chưa? – Jason

+0

theatrus đưa ra một câu trả lời hay ở đây về cách php xử lý các biến. Nếu bạn cố gắng sử dụng một biến và php không biết về nó, nó có thể ném một ngoại lệ (một cảnh báo, tôi nghĩ rằng, tôi không chắc chắn ..). 'isset ($ variable)' có thể cho bạn biết nếu một biến được định nghĩa, và bạn có thể thực hiện các công cụ như 'unset ($ variable)'. Nhưng [hướng dẫn] (http://php.net/manual/en/index.php) giải thích nó tốt hơn tôi – cambraca

+0

@cambraca - bạn đang nói về 'unset()' trong hướng dẫn, hoặc hướng dẫn sử dụng để trả lời câu hỏi của tôi? Tôi không thấy bất cứ nơi nào trên TOC nơi nó nói về cách nó xử lý các kiểu dữ liệu. Chỉ có các loại? Có lẽ tôi đang nhìn cái gì đó. – Jason

-1

PHP hiện hỗ trợ loại gợi ý, bạn có thể bao gồm những thứ như 'chuỗi' hoặc 'mảng' trong định nghĩa hàm bị bắt khi các tập lệnh được phân tích cú pháp để cho biết có loại không phù hợp.

+0

Tôi đã không nhìn vào CÁCH để tìm các loại var. Thêm về cách PHP biết các kiểu dữ liệu. – Jason

+0

Tôi có cung cấp một số thông tin không chính xác không? – KeatsKelleher

0

"Làm thế nào để PHP biên dịch? Làm thế nào để nó biết những gì kiểu biến sẽ là? Liệu nó thậm chí còn quan tâm?

Câu hỏi này không có liên quan đến bất cứ điều gì tôi đang làm. Tôi chỉ tò mò."

PHP là ngôn ngữ phiên dịch và nó không biên dịch.

PHP không biết loại biến sẽ là gì, vì loại biến được xác định theo loại giá trị được chỉ định lần cuối cho biến đó.

Bạn có thể làm điều này:

$foo = 5; 
var_dump($foo); 
$foo = "5"; 
var_dump($foo); 
$foo = array(); 
$foo[] = 0; 
$foo[] = 1; 
$foo[] = 2; 
var_dump($foo); 

Như bạn có thể thấy, bất cứ khi nào một giá trị được gán cho foo, loại có thể được thay đổi.

PHP không quan tâm đến loại biến của bạn, bởi vì đó là ngôn ngữ lập trình và không có cảm xúc.

EDIT:

"Hoặc tôi đang so sánh Táo với cam?"

Có, bạn đang có. Here bạn có thể tìm hiểu thêm về ngôn ngữ.

EDIT2:

PHP là ngôn ngữ kịch bản có trình thông dịch và không có trình biên dịch. Điều này có nghĩa rằng trong PHP bạn chỉ có thể gặp lỗi thời gian chạy. Đó là một ngôn ngữ tự do nếu chúng ta xem xét các loại, bởi vì bạn có quyền làm bất cứ điều gì với các biến của bạn và các loại của chúng sẽ được sửa đổi theo cách sử dụng chúng.

Các liên kết này có thể có ích cho bạn:

http://www.gidforums.com/t-11866.html

http://www.webmaster-talk.com/coding-forum/186350-fundamental-differences-between-php-c-c.html

Variable scope difference between PHP and C: block scope is not exactly the same?

Lưu ý, rằng PHP được thực hiện trên máy chủ, nếu bạn muốn tạo các sự kiện của khách hàng, Javascript là đề nghị của tôi.

+0

Haha. Ngôn ngữ lập trình rất quan tâm. Bao giờ quên một dấu chấm phẩy? PHP.net không nói về PHP làm việc như thế nào. Chỉ cần thực hiện. Tôi muốn biết về cấp độ Kỹ sư Điện (hoặc CompE) (vì đó là điều tôi đang làm). – Jason

+0

Câu cuối cùng là không cần thiết. Tôi không cố gắng so sánh và đối chiếu JS và PHP. Tôi biết JS là dành cho khách hàng và PHP là máy chủ. Cảm ơn bạn đã đào các liên kết đó. – Jason

+0

Không sao, tôi rất vui nếu tôi có thể giúp. –

0

Tôi nhận ra đây là một câu hỏi cũ nhưng đây là một số thông tin cụ thể hơn về cách PHP xử lý các câu hỏi mà OP yêu cầu.

Đây là trang từ tài liệu tham khảo PHP mà bạn muốn bắt đầu với:

Introduction to Variables

tôi biết liên kết không được ưa chuộng nhưng liên kết nên được ổn định và tôi không muốn bán buôn sao chép tài liệu tham khảo PHP. Dưới đây là những điểm nổi bật.

OP: PHP biết loại biến đó sử dụng như thế nào (hay không)?

PHP được viết bằng C và sử dụng một typedef struct C mà họ gọi là zval cùng với một C đoàn typedef đó là kêu gọi một zval_value để đại diện cho tất cả các biến.

typedef struct _zval_struct { 
    zvalue_value value;  /* variable value */ 
    zend_uint refcount__gc; /* reference counter */ 
    zend_uchar type;   /* value type */ 
    zend_uchar is_ref__gc;  /* reference flag */ 
} zval; 

"Động cơ cố gắng để che đậy sự phức tạp của khái niệm của một biến có thể là bất kỳ loại bằng cách cung cấp một bộ đồng phục và trực quan tập hợp các macro để truy cập vào các cấu trúc trên nhiều lĩnh vực."

"PHP là ngôn ngữ động, được nhập lỏng lẻo, sử dụng tính năng sao chép và ghi tham chiếu". Tham chiếu Đếm và Sao chép-ghi-ghi (COW) là hai khái niệm mạnh mẽ mà PHP sử dụng mà tôi sẽ không đi vào đây nhưng đáng đọc.

"Nhập sai là ẩn tùy chọn của công cụ để chuyển đổi hoặc ép buộc các biến vào loại được yêu cầu tại thời điểm thực hiện. Tính tham chiếu là phương tiện mà động cơ có thể suy ra khi biến không còn tham chiếu nào trong mã người dùng và do đó có thể giải phóng các cấu trúc liên quan đến biến đó. "

"Các zval_value là một sự kết hợp mà có thể đại diện cho tất cả các loại một biến có thể giữ."

"... một biến thể của một loại, dữ liệu biến được đại diện bởi các trường thích hợp trong Bản thân zval giữ loại, số tham chiếu và cờ để cho biết biến có phải là tham chiếu hay không. "

PHP biên dịch như thế nào?

"Biên dịch" là một từ rộng có thể có ý nghĩa khác và PHP không biên dịch theo nghĩa truyền thống. Nó thực hiện một loại biên dịch trước khi chuyển đổi mã nguồn thành các mã opcode là các lệnh có thể được thực thi bởi bộ xử lý. Các opcodes này được lưu trữ để ngăn PHP phải phân tích cú pháp các tập lệnh được gọi thường xuyên.

Làm cách nào để biết loại biến thể sẽ là gì? Liệu nó có quan tâm không?

Như đã trích dẫn ở trên nó là động cơ của PHP "sở thích để chuyển đổi, hoặc ép buộc biến thành các loại yêu cầu tại thời gian thực hiện." Baiscally PHP luôn lưu trữ những gì nó xác định kiểu của biến khi nó được tạo ra nhưng khi một biến được tham chiếu, PHP thực hiện một quyết định khác về kiểu dựa trên ngữ cảnh mà nó đang được sử dụng.

"PHP là yếu gõ, như vậy động cơ cung cấp các hàm API để chuyển đổi biến từ kiểu này sang kiểu khác."

Động cơ có một tập hợp các macro nó sử dụng để làm việc với các zvals để chuyển đổi một loại biến để bạn thường không phải đối phó với điều đó.

Nếu bạn muốn xem những gì zvals trông giống như trong hành động mà họ có thể được đổ với:

debug_zval_dump($variableName); 
Các vấn đề liên quan