Posted on June 16, 2015 by Kasper KopecIn PHP, traits are a mechanism  dịch - Posted on June 16, 2015 by Kasper KopecIn PHP, traits are a mechanism  Việt làm thế nào để nói

Posted on June 16, 2015 by Kasper K


Posted on June 16, 2015 by Kasper Kopec

In PHP, traits are a mechanism of code reuse that, while very powerful, are also difficult to type check both efficiently and exhaustively. In this post we’ll dive more deeply into the reasons for that and see how Hack solves those problems, allowing you to use traits in a safe way without limiting their expressiveness.

To jog your memory: traits are bundles of code that can be dropped into any class to extends its functionality:

trait T {
public function f(string $s): string {
...
}
}

class C {
use T; // line that makes calls to $this->f(...) possible

public function test(): string {
return $this->f('foo');
}
}
At runtime, using the trait results in its body being basically copy-pasted into the using class. Trait code can then call class methods freely – to make it safe we need to ensure that those methods even exist, and that they accept and return expected types:

// Note: this is a hypothetical example of kind of mistake that
// we would like to catch. The type checker will actually prevent
// it by rejecting the definition of T written here as not safe
// - see discussion below.
trait T {
private function f(string $s): string {
return $this->g();
}
}

class C {
use T;

public function test(): void {
$this->f("foo"); // ERROR: f will try calling g, which doesn't exist
} // in this class

}
So, how is this situation different from checking any other function and why can’t Hack just work and do it? The key difference here is that the unsoundness might not be contained in the trait definition (its body) itself, nor in using its declaration at particular location, but depend on both of them. In the example above, it’s not possible to look at the body of function f and say if it’s correct or not (it depends on what $this is), nor is it possible to look at body of C and, knowing only signatures of functions in T, say whether using T there is safe — it depends on what those functions do with $this.

Because of this, in PHP’s unrestricted copy-paste model, in order to check trait usage we need the actual bodies, not just the definitions. This means that changing a single character in a trait function body would require going through all the classes using it and re-checking them. To understand why this is unacceptable, we need to look back at Hack original design goals.
0/5000
Từ: -
Sang: -
Kết quả (Việt) 1: [Sao chép]
Sao chép!
Đăng ngày 16 tháng 6 năm 2015 bởi Kasper KopecTrong PHP, đặc điểm là một cơ chế sử dụng lại mã mà, trong khi rất mạnh mẽ, cũng là khó khăn để gõ kiểm tra cả hai hiệu quả và exhaustively. Trong bài này, chúng tôi sẽ bổ nhào sâu hơn vào những lý do cho điều đó và xem như thế nào Hack giải quyết những vấn đề, cho phép bạn sử dụng những đặc điểm trong một cách an toàn mà không có hạn chế biểu cảm của họ.Để chạy bộ nhớ của bạn: đặc điểm là bó của mã đó có thể được đưa vào bất kỳ lớp học để mở rộng chức năng của nó:đặc điểm T {} công hàm số f (chuỗi $s): Chuỗi {} ... }}lớp C {} sử dụng T; dòng mà làm cho các cuộc gọi đến $this -> f(...) tốt chức năng công cộng test(): Chuỗi {} trở lại $this -> f('foo'); }}Tại thời gian chạy, sử dụng kết quả đặc điểm trong cơ thể của nó được về cơ bản sao chép-dán vào sử dụng các lớp. Đặc điểm mã sau đó có thể gọi phương pháp lớp tự do-để làm cho nó an toàn, chúng tôi cần phải đảm bảo rằng các phương pháp đó thậm chí tồn tại, và rằng họ chấp nhận và trả lại dự kiến sẽ loại:Lưu ý: đây là một ví dụ giả thuyết của loại sai lầm mà chúng tôi muốn bắt. Việc kiểm tra loại sẽ thực sự ngăn chặnnó từ chối định nghĩa của T viết ở đây là không an toàn -Xem thảo luận dưới đây.đặc điểm T {} riêng hàm f (chuỗi $s): Chuỗi {} trở lại $this -> g(); }}lớp C {} sử dụng T; chức năng công cộng test(): void {} $this -> f("foo"); LỖI: f sẽ cố gắng gọi g, mà không tồn tại } / / trong lớp này }Vì vậy, làm thế nào là tình trạng này khác nhau từ kiểm tra bất kỳ chức năng khác và tại sao không thể Hack chỉ cần làm việc và làm điều đó? Sự khác biệt quan trọng ở đây là unsoundness có thể không được bao gồm trong định nghĩa đặc điểm (cơ thể của nó), cũng không phải trong việc sử dụng của nó tuyên bố tại địa điểm cụ thể, nhưng phụ thuộc vào cả hai người trong số họ. Trong ví dụ ở trên, nó là không thể nhìn vào cơ thể của hàm số f và nói nếu nó là đúng hay không (nó phụ thuộc vào những gì $this là), và cũng không có thể nhìn vào cơ thể của C, và biết chỉ có chữ ký của các chức năng trong, nói cho dù sử dụng T có là an toàn-nó phụ thuộc vào những gì những chức năng làm với $this.Bởi vì điều này, trong các mô hình không hạn chế sao chép-dán của PHP, để kiểm tra sử dụng đặc điểm chúng tôi cần các cơ quan thực tế, không chỉ là các định nghĩa. Điều này có nghĩa rằng thay đổi một nhân vật duy nhất trong một cơ thể chức năng đặc điểm sẽ yêu cầu đi qua tất cả các lớp học bằng cách sử dụng nó và tái kiểm tra chúng. Để hiểu lý do tại sao điều này là không thể chấp nhận, chúng ta phải nhìn lại Hack mục tiêu thiết kế ban đầu.
đang được dịch, vui lòng đợi..
Kết quả (Việt) 2:[Sao chép]
Sao chép!

Được đăng vào ngày 16 Tháng Sáu 2015 bởi Kasper Kopec Trong PHP, đặc điểm là một cơ chế mã tái sử dụng mà, trong khi rất mạnh mẽ, cũng rất khó để gõ kiểm tra cả hai hiệu quả và triệt. Trong bài này chúng ta sẽ đi sâu hơn vào những lý do cho điều đó và xem như thế nào Hack giải quyết những vấn đề, ​​cho phép bạn sử dụng các đặc điểm này ở một cách an toàn mà không hạn chế biểu cảm của họ. Để bạn nhớ lại: đặc điểm là bó mã có thể được giảm xuống vào bất kỳ lớp học để mở rộng chức năng của nó: đặc điểm T {công hàm f (string $ s): string {...}} class C {sử dụng T; // Dòng mà làm cho các cuộc gọi đến $ this-> f (...) có thể kiểm tra chức năng công cộng (): string {return $ this-> f ('foo');}} Khi chạy, sử dụng kết quả tính trạng cơ thể của nó về cơ bản được sao chép-dán vào lớp khi sử dụng. Mã Trait sau đó có thể gọi phương thức lớp tự do - để làm cho nó an toàn, chúng tôi cần phải đảm bảo rằng những phương pháp mặc tồn tại, và họ chấp nhận và trở lại các loại dự kiến: // Chú ý: đây là một ví dụ giả thuyết của loại sai lầm mà // chúng ta sẽ như để bắt. Các loại kiểm tra sẽ thực sự ngăn chặn // nó bằng cách từ chối định nghĩa của T viết ở đây là không an toàn // - xem thảo luận bên dưới. Trait T {private function f (string $ s): string {return $ this-> g (); }} class C {sử dụng T; kiểm tra chức năng công cộng (): void {$ this-> f ("foo"); // ERROR: f sẽ thử gọi g, mà không tồn tại} // trong lớp này} Vì vậy, làm thế nào là tình hình này khác nhau từ việc kiểm tra bất kỳ chức năng nào khác và tại sao không thể Hack chỉ làm việc và làm điều đó? Sự khác biệt chính ở đây là không lành mạnh có thể không được chứa đựng trong định nghĩa đặc điểm (cơ thể của nó) tự nó, cũng không sử dụng trong tuyên bố của mình ở vị trí đặc biệt, nhưng phụ thuộc vào cả hai. Trong ví dụ trên, nó không thể nhìn vào cơ thể của hàm f và nói nếu nó là đúng hay không (nó phụ thuộc vào những gì $ này là), cũng không phải là nó có thể nhìn vào cơ thể của C và, chỉ biết chữ ký của chức năng trong T, nói cho dù sử dụng T có được an toàn - nó phụ thuộc vào những gì các chức năng làm với $ này. Bởi vì điều này, trong không hạn chế mô hình copy-paste của PHP, để kiểm tra việc sử dụng đặc điểm chúng ta cần các cơ quan thực tế, không chỉ các định nghĩa . Điều này có nghĩa rằng việc thay đổi một nhân vật duy nhất trong một cơ quan chức năng đặc điểm đòi hỏi phải đi qua tất cả các lớp học sử dụng nó và kiểm tra lại chúng. Để hiểu tại sao điều này là không thể chấp nhận, chúng ta cần phải nhìn lại Hack mục tiêu thiết kế ban đầu.








































đang được dịch, vui lòng đợi..
 
Các ngôn ngữ khác
Hỗ trợ công cụ dịch thuật: Albania, Amharic, Anh, Armenia, Azerbaijan, Ba Lan, Ba Tư, Bantu, Basque, Belarus, Bengal, Bosnia, Bulgaria, Bồ Đào Nha, Catalan, Cebuano, Chichewa, Corsi, Creole (Haiti), Croatia, Do Thái, Estonia, Filipino, Frisia, Gael Scotland, Galicia, George, Gujarat, Hausa, Hawaii, Hindi, Hmong, Hungary, Hy Lạp, Hà Lan, Hà Lan (Nam Phi), Hàn, Iceland, Igbo, Ireland, Java, Kannada, Kazakh, Khmer, Kinyarwanda, Klingon, Kurd, Kyrgyz, Latinh, Latvia, Litva, Luxembourg, Lào, Macedonia, Malagasy, Malayalam, Malta, Maori, Marathi, Myanmar, Mã Lai, Mông Cổ, Na Uy, Nepal, Nga, Nhật, Odia (Oriya), Pashto, Pháp, Phát hiện ngôn ngữ, Phần Lan, Punjab, Quốc tế ngữ, Rumani, Samoa, Serbia, Sesotho, Shona, Sindhi, Sinhala, Slovak, Slovenia, Somali, Sunda, Swahili, Séc, Tajik, Tamil, Tatar, Telugu, Thái, Thổ Nhĩ Kỳ, Thụy Điển, Tiếng Indonesia, Tiếng Ý, Trung, Trung (Phồn thể), Turkmen, Tây Ban Nha, Ukraina, Urdu, Uyghur, Uzbek, Việt, Xứ Wales, Yiddish, Yoruba, Zulu, Đan Mạch, Đức, Ả Rập, dịch ngôn ngữ.

Copyright ©2025 I Love Translation. All reserved.

E-mail: