Sử dụng PHP một cách nghiêm túc. Học PHP bằng cách sử dụng Công cụ sửa đổi đầu ra với các tham số

Tên lửa Soyuz được tàu hỏa đưa tới bệ phóng. Ảnh phạm vi công cộng của NASA.

Ưu điểm của PHP

PHP có một số tính năng rất sâu sắc và chắc chắn là đúng.

Đầu tiên, tình trạng. Mọi yêu cầu web đều bắt đầu với một bảng hoàn toàn trống. Không gian tên và các biến toàn cục của nó chưa được khởi tạo, ngoại trừ một số biến, hàm và lớp toàn cục tiêu chuẩn cung cấp chức năng nguyên thủy và hỗ trợ cuộc sống. Bằng cách bắt đầu mỗi yêu cầu từ một trạng thái đã biết, chúng tôi có được một kiểu cách ly khỏi các lỗi có thể xảy ra; Nếu yêu cầu t gặp sự cố phần mềm và bị lỗi thì lỗi đó không ảnh hưởng đến việc thực hiện yêu cầu t+1 tiếp theo. Tất nhiên, trên thực tế, trạng thái ứng dụng nằm ở những nơi khác ngoài vùng nhớ chương trình và hoàn toàn có khả năng làm hỏng cơ sở dữ liệu, memcache hoặc hệ thống tệp. Nhưng PHP chia sẻ điểm yếu này với mọi framework có thể tưởng tượng được cho phép duy trì trạng thái. Đồng thời, việc chia sẻ đống phần mềm giữa các yêu cầu giúp giảm chi phí cho hầu hết các lỗi phần mềm.

Thứ hai, sự song hành. Một yêu cầu riêng lẻ chạy trong một luồng PHP. Thoạt nhìn, đây có vẻ như là một hạn chế ngu ngốc. Nhưng vì ứng dụng của chúng tôi chạy trong ngữ cảnh của một máy chủ web nên chúng tôi có một nguồn đồng thời tự nhiên: các yêu cầu web. Chỉ cần gửi các yêu cầu không đồng bộ đến chính chúng ta, chúng ta có thể dễ dàng đạt được tính song song với các trạng thái biệt lập và lệnh gọi sao chép-khôi phục. Trong thực tế, cách này an toàn hơn và có khả năng chịu lỗi cao hơn so với cách tiếp cận trạng thái khóa và chia sẻ được sử dụng trong các ngôn ngữ có mục đích chung khác.

Tóm lại, thực tế là các chương trình PHP hoạt động ở mức yêu cầu có nghĩa là quy trình làm việc của lập trình viên nhanh và hiệu quả và vẫn nhanh sau khi ứng dụng thay đổi. Rất nhiều ngôn ngữ năng suất tuyên bố thực hiện việc này, nhưng trừ khi chúng xóa trạng thái của mình trên mọi yêu cầu và luồng sự kiện chính chia sẻ trạng thái cấp chương trình giữa các yêu cầu, chúng hầu như luôn mất một chút thời gian để chạy. Đối với một máy chủ ứng dụng Python điển hình, một vòng lặp gỡ lỗi thông thường sẽ giống như “suy nghĩ, chỉnh sửa, khởi động lại máy chủ, gửi một số yêu cầu kiểm tra”. Ngay cả khi “khởi động lại máy chủ” chỉ mất vài giây trong tổng số giờ, thì cũng phải mất một phần lớn trong 15-30 giây của bộ não con người chúng ta dành cho nhu cầu giữ phần không cần thiết nhất của trạng thái hiện tại trong đầu.

Tôi lập luận rằng phong cách phát triển PHP "suy nghĩ, chỉnh sửa, tải lại" giúp các nhà phát triển làm việc hiệu quả hơn. Trong các chu kỳ phát triển dự án dài và phức tạp, điều này thậm chí còn mang lại lợi ích lớn hơn.

Vụ kiện chống lại PHP

Nếu tất cả những điều này là sự thật thì tại sao anh ấy lại bị ghét đến vậy? Khi bạn đặt tất cả sự cường điệu đầy màu sắc sang một bên, những phàn nàn chính về cụm PHP sẽ tập trung vào các vấn đề sau:


Nghe có vẻ không giống một người biện hộ cho PHP thiếu suy nghĩ: đây đều là những vấn đề nghiêm trọng khiến nó có nhiều khả năng gây ra lỗi hơn. Chúng là những lỗi không thể bắt buộc. Không có sự đánh đổi cố hữu nào giữa các Phần tốt của PHP và những vấn đề này. Có thể tạo ra PHP để giải quyết những thiếu sót này trong khi vẫn giữ được tất cả các khía cạnh tốt.

HHVM và Hack

Người kế thừa hệ thống PHP này được gọi là Hack

Hack là cái mà mọi người gọi là ngôn ngữ lập trình "hệ thống kiểu tăng dần" cho PHP. "Hệ thống loại" có nghĩa là nó cho phép lập trình viên tự động tạo ra các bất biến có thể kiểm chứng được về dữ liệu truyền qua mã: một hàm đã cho lấy một chuỗi hoặc một số và trả về một bảng Fribbles, như trong Java, C++ hoặc Haskell hoặc bất kỳ loại tĩnh nào khác ngôn ngữ gõ, bất cứ ngôn ngữ nào bạn chọn. "Dần dần" có nghĩa là một số phần trong cơ sở mã của bạn có thể được nhập tĩnh, trong khi các phần khác có thể vẫn ở dạng PHP động, lộn xộn. Khả năng kết hợp các phương pháp này cho phép di chuyển các cơ sở mã lớn theo thời gian.

Thay vì đổ cả đống giấy mực vào đây để mô tả hệ thống kiểu Hack và cách thức hoạt động của nó, hãy thử chơi đùa với nó. Tôi sẽ ở đây khi bạn trở lại.

Đó là một hệ thống gọn gàng và khá tham vọng về những gì nó cho phép bạn thể hiện. Và việc có khả năng chuyển dần một dự án sang Hack khi nó phát triển lớn hơn bạn mong đợi ban đầu là một lợi ích đặc biệt của hệ sinh thái PHP. Kiểm tra loại hack duy trì quy trình làm việc kiểu "suy nghĩ, chỉnh sửa, tải lại trang" vì chúng chạy ở chế độ nền, cập nhật dần dần mô hình cơ sở mã khi thấy hệ thống tệp có sửa đổi. Dự án Hack cung cấp khả năng tích hợp với tất cả các trình soạn thảo và IDE phổ biến, do đó bạn có thể xem phản hồi về lỗi loại ngay khi nhập xong, giống như trong bản demo trên web.

Chúng ta hãy xem xét tổng thể các rủi ro thực sự mà PHP tạo ra dưới góc độ Hack:


Hack mang đến một cơ hội mà các thành viên phổ biến khác trong gia đình MPDPL không có: khả năng giới thiệu một hệ thống loại sau quá trình phát triển chính và chỉ một phần trong những phần của hệ thống nơi giá trị lớn hơn chi phí.

HHVM

Hack ban đầu được phát triển như một phần của Máy ảo HipHop, hay HHVM, một môi trường ảo nguồn mở dành cho PHP. HHVM cung cấp một tùy chọn quan trọng khác để dự án thành công: khả năng khởi chạy trang web của bạn nhanh hơn và tiết kiệm hơn. Facebook

Bộ lọc trong Revolution cho phép bạn thao tác cách xử lý một số thẻ nhất định. Chúng cho phép bạn thay đổi giá trị ngay trong mẫu của mình.

Bộ lọc đầu vào

Hiện nay, các bộ lọc đầu vào được sử dụng để chuẩn bị cho việc xử lý các bộ lọc đầu ra. Chúng thường chỉ được sử dụng bên trong động cơ MODX.

Bộ lọc đầu ra

Trong Revolution, các bộ lọc đầu ra hoạt động giống như PHx trong Evolution, chỉ có các bộ lọc hiện được tích hợp trực tiếp vào công cụ MODX. Cú pháp trông như thế này:

[]

Bộ lọc có thể được áp dụng tuần tự. Để làm điều này, hãy viết chúng thành một hàng (từ trái sang phải):

[]

Bộ lọc cũng có thể được sử dụng để sửa đổi đầu ra của đoạn trích. Bộ lọc phải được chỉ định trước tất cả các tham số (trước dấu chấm hỏi):

[]

Bộ điều chỉnh đầu ra

Bảng này hiển thị một số từ bổ nghĩa và ví dụ về cách sử dụng chúng. Trong các ví dụ, công cụ sửa đổi được áp dụng cho phần giữ chỗ, nhưng bạn nên nhớ rằng chúng có thể được áp dụng cho bất kỳ thẻ MODX nào. Hãy đảm bảo thẻ bạn sử dụng xuất ra ít nhất thứ gì đó mà công cụ sửa đổi sẽ xử lý.

Bộ điều chỉnh đầu ra có điều kiện

bổ nghĩa Sự miêu tả Ví dụ sử dụng
nếu, đầu vào Truyền văn bản tùy ý làm đầu vào cho công cụ sửa đổi tiếp theo [[*id:input=`[[+placeholder]]`:is=`1`:then=`Yes`:else=`No`]]
hoặc HOẶC [[+numbooks:is=`5`:or:is=`6`:then=`Có 5 hoặc 6 cuốn sách ở đây`:else=`Không chắc có bao nhiêu cuốn`]]
Kết hợp nhiều sửa đổi với một liên kết [[+numbooks:gt=`5`:and:lt=`10`:then=`Có từ 5 đến 10 cuốn sách ở đây`:else=`Có ít hơn 5 hoặc nhiều hơn 10 cuốn`]]
bằng, bằng, bằng, bằng, là, eq So sánh giá trị được truyền với giá trị được đặt. Nếu các giá trị khớp nhau, giá trị “thì” sẽ được hiển thị, nếu không - “khác” [[+numbooks:isequalto=`5`:then=`Có 5 cuốn sách ở đây`:else=`Không chắc có bao nhiêu cuốn`]]
notequalto, notequals, isnt, isnot, neq, ne So sánh giá trị được truyền với giá trị được đặt. Nếu các giá trị KHÔNG khớp, giá trị "thì" sẽ được hiển thị, nếu không - "else" [[+numbooks:notequalto=`5`:then=`Không chắc có bao nhiêu cuốn sách`:else=`Có 5 cuốn`]]
lớn hơn hoặc bằng, bằng hoặc lớn hơn, ge, ví dụ: isgte, gte Tương tự, chỉ có điều kiện là “Lớn hơn hoặc bằng” [[+numbooks:gte=`5`:then=`Có 5 cuốn sách trở lên ở đây`:else=`Có ít hơn 5 cuốn sách ở đây`]]
lớn hơn, lớn hơn, isgt, gt Tương tự, chỉ có điều kiện “Nghiêm ngặt hơn” [[+numbooks:gt=`5`:then=`Có nhiều hơn năm cuốn sách ở đây`:else=`Có 5 cuốn sách trở xuống`]]
bằngtoorlessthan, less thanorequalto, el, le, islte, lte Tương tự, chỉ có điều kiện là “Nhỏ hơn hoặc bằng” [[+numbooks:lte=`5`:then=`Có 5 cuốn sách hoặc ít hơn ở đây`:else=`Có nhiều hơn 5 cuốn sách ở đây`]]
thấp hơn, nhỏ hơn, thấp hơn, nhỏ hơn, islt, lt Tương tự, chỉ có điều kiện “Ít hơn” [[+numbooks:lte=`5`:then=`Có ít hơn năm cuốn sách ở đây`:else=`Có 5 cuốn sách trở lên ở đây`]]
trốn Ẩn phần tử nếu điều kiện đúng [[+numbooks:lt=`1`:hide]]
trình diễn Hiển thị một phần tử nếu điều kiện đúng [[+numbooks:gt=`0`:show]]
sau đó Dùng để tạo điều kiện [[+numbooks:gt=`0`:then=`Sách còn trong kho!`]]
khác Dùng để tạo điều kiện (cùng với “then”) [[+numbooks:gt=`0`:then=`Sách còn hàng!`:else=`Xin lỗi, nhưng mọi thứ đều đã bán hết.`]]
thành viên của, là thành viên, mo Kiểm tra xem người dùng có phải là thành viên của nhóm người dùng được chỉ định hay không [[!+modx.user.id:memberof=`Quản trị viên`]]

Công cụ sửa đổi để làm việc với chuỗi

bổ nghĩa Sự miêu tả Ví dụ sử dụng
con mèo Thêm một giá trị sau thẻ [[+numbooks:cat=`books`]]
chữ l, chữ thường, strtower Chuyển đổi tất cả các chữ cái thành chữ thường [[tiêu đề:lcase]]
ucase, chữ hoa, strtoupper Chuyển đổi tất cả các chữ cái thành chữ hoa [[+tiêu đề:ucase]]
ucwords Viết hoa chữ cái đầu tiên của từ [[tiêu đề:ucwords]]
ucfirst Viết hoa chữ cái đầu tiên trong chuỗi [[tên:ucfirst]]
htmlent, htmlentities Chuyển đổi tất cả các ký tự thành các thực thể HTML tương ứng [[email:htmlent]]
thoát, trốn thoát Thoát khỏi các ký tự một cách an toàn bằng cách sử dụng biểu thức chính quy và `str_replace()`. Cũng thoát khỏi thẻ MODX. [[email:escape]]
dải Thay thế tất cả dấu gạch nối, tab và bất kỳ số lượng dấu cách nào chỉ bằng một dấu cách [[tài liệu văn bản:dải]]
dải chuỗi Cắt chuỗi con đã chỉ định khỏi một chuỗi [[+tên:stripString=`Mr.`]]
thay thế Thay thế chuỗi con [[+pagetitle:replace=`Mr.==Bà.`]]
thẻ thoát y, thẻ dải, thẻ thông báo, dải_tags Cắt bỏ tất cả các thẻ (có thể chỉ định các thẻ được phép). Không sử dụng cho mục đích an toàn. [[+mã:strip_tags]]
len, chiều dài, strlen In độ dài của một chuỗi [[+chuỗi dài:strlen]]
đảo ngược, strrev Đảo ngược từng ký tự trong chuỗi [[+mirrortext:đảo ngược]]
gói từ Chèn dấu ngắt dòng sau mỗi ký tự thứ n (các từ không bị ngắt dòng) [[bodytext:wordwrap=`80`]]
cắt chữ Chèn dấu ngắt dòng sau mỗi ký tự thứ n, ngay cả khi ký tự này nằm trong một từ [[+bodytext:wordwrapcut=`80`]]
giới hạn In một số ký tự được chỉ định từ đầu dòng (mặc định là 100) [[+mô tả:giới hạn=`50`]]
dấu chấm lửng Thêm dấu chấm lửng và cắt bớt dòng nếu nó dài hơn số ký tự được chỉ định (mặc định là 100) [[+mô tả:dấu chấm lửng=`50`]]
nhãn Che chắn. Hiển thị phần tử nguyên trạng, không có :tag. Để sử dụng trong tài liệu [[+showThis:tag]]
thêm, tăng thêm, tăng thêm Thêm số được chỉ định (mặc định +1) [[+downloads:incr]] [[+blackjack:add=`21`]]
trừ, giảm, giảm Trừ số đã chỉ định (mặc định -1) [[+countdown:decr]] [[+moneys:subtract=`100`]]
nhân lên, mpy Nhân với số được chỉ định (mặc định *2) [[+trifecta:mpy=`3`]]
chia, chia Chia cho số được chỉ định (mặc định /2) [[+xếp hạng:div=`4`]]
mô đun, mod Trả về mô đun của một số (mặc định: %2, trả về 0 hoặc 1) [[số:mod]]
nếu trống,mặc định,trống,không trống Trả về giá trị sửa đổi nếu giá trị thẻ trống [[+tên:mặc định=`anonymous`]]
không trống rỗng, !trống rỗng, nếu không trống rỗng, không trống rỗng Trả về giá trị sửa đổi nếu giá trị thẻ Không trống [[+name:notempty=`Xin chào [[+name]]!`]]
nl2br Thay thế dòng mới \n bằng thẻ HTML br [[+tệp văn bản:nl2br]]
ngày Chuyển đổi dấu thời gian thành văn bản theo định dạng đã chỉ định (định dạng ngày) [[+năm sinh:ngày=`%Y`]]
thời gian đột ngột Chuyển đổi ngày dưới dạng văn bản thành dấu thời gian UNIX [[+thetime:strtotime]]
ngày mờ Chấp nhận dấu thời gian và trả về một ngày ở dạng "Hôm nay lúc 16:20 chiều" [[+createdon:fuzzydate]]
trước kia Trả về số giây, phút, tuần hoặc tháng đã trôi qua kể từ ngày được chỉ định trong thẻ. [[+createdon:ago]]
md5 Tạo hàm băm MD5 của một giá trị [[+mật khẩu:md5]]
dữ liệu cdata Bao bọc đầu ra bằng thẻ CDATA [[nội dung:cdata]]
thông tin người dùng Trả về giá trị được yêu cầu từ hồ sơ người dùng. Cần có ID người dùng [[!+modx.user.id:userinfo=`tên người dùng`]]
đang đăng nhập Trả về 1 nếu người dùng được ủy quyền trong ngữ cảnh hiện tại [[!+modx.user.id:isloggedin:is=`1`:then=`Yes`:else=`No`]]
không đăng nhập Trả về 1 nếu người dùng Khôngđược ủy quyền trong bối cảnh hiện tại [[!+modx.user.id:isnotloggedin:is=`1`:then=`No`:else=`Yes`]]
mã url Chuyển đổi giá trị dưới dạng URL, nghĩa là sử dụng hàm `urlencode()` của PHP [[+mystring:urlencode]]
mã url Chuyển đổi giá trị từ một URL, nghĩa là sử dụng hàm PHP `urldecode()` [[+myparam:urldecode]]

Công cụ sửa đổi để làm việc với người dùng phải được gọi là không được lưu vào bộ đệm để mỗi người dùng có thể xem dữ liệu mới nhất.

Sử dụng Công cụ sửa đổi đầu ra với các tham số

Nếu thẻ có tham số thì chúng phải được viết ngay sau từ bổ nghĩa:

[[!getResources:default=`Xin lỗi, không tìm thấy gì`? &tplFirst=`blogTpl` &parents=`2,3,4,8` &tvFilters=`blog_tags==%[[!tag:htmlent]]%` &includeTVs=`1` ]]

Tạo một công cụ sửa đổi tùy chỉnh

Bất kỳ đoạn mã nào cũng có thể được sử dụng làm công cụ sửa đổi đầu ra. Để thực hiện việc này, chỉ cần chỉ định tên đoạn mã thay vì từ bổ nghĩa. Ví dụ: hãy tạo một đoạn mã [] để thêm một số dấu chấm than nhất định vào đầu ra:

[[*pagetitle:makeExciting=`4`]]

Lệnh gọi thẻ như vậy sẽ chuyển các tham số sau tới đoạn mã makeExciting để xử lý:

Tham số Nghĩa Giá trị mẫu
  1. Quá tải thuộc tính lớp
  2. Quyền truy cập vào các thuộc tính đối tượng có thể bị quá tải khi sử dụng các phương thức __gọi, __lấy__bộ. Các phương thức này sẽ chỉ kích hoạt nếu đối tượng hoặc đối tượng được kế thừa không chứa thuộc tính đang được truy cập. Cú pháp là:

    trống rỗng __bộ(tên chuỗi, giá trị hỗn hợp)

    Vô hiệu __lấy(tên hỗn hợp)

    Với các phương thức này, các thuộc tính của lớp có thể được nạp chồng để thực thi mã tùy ý được xác định trong lớp. Đối số tên chứa tên của thuộc tính đang được truy cập. Đối số giá trị cho phương thức __set() phải chứa giá trị sẽ được gán cho thuộc tính lớp có tên name.

    __lấy__bộ:

    Trình thiết lập lớp(
    công khai $n ;
    riêng tư $x = array("a" => 1 , "b" => 2 , "c" => 3 );

    Hàm __get ($nm) (
    in "Đọc [$nm]\n" ;

    Nếu (isset($this -> x [ $nm ])) (
    $r = $this -> x [ $nm ];
    print "Đã nhận: $r\n" ;
    trả lại $r ;
    ) khác (
    in "Không có gì!\n" ;
    }
    }

    Hàm __set ($nm, $val) (
    print "Viết $val vào [$nm]\n" ;

    Nếu (isset($this -> x [ $nm ])) (
    $this -> x [ $nm ] = $val ;
    in "OK!\n" ;
    ) khác (
    print "Mọi thứ đều tệ!\n" ;
    }
    }
    }

    $foo = Người định cư mới();
    $foo -> n = 1 ;
    $foo -> a = 100 ;
    $foo -> a++;
    $foo -> z++;
    var_dump($foo);
    ?>

    Kết quả thực thi script đang xét sẽ là:

    Chúng tôi viết 100 trong [a]
    ĐƯỢC RỒI!
    Đọc một]
    Đã nhận: 100
    Chúng tôi viết 101 trong [a]
    ĐƯỢC RỒI!
    Đọc [z]
    Không có gì!
    Viết 1 vào [z]
    Tất cả mọi thứ là xấu!
    đối tượng(Setter)#1 (2) (
    ["n"]=>
    int(1)
    ["x:riêng tư"]=>
    mảng(3) (
    ["a"]=>
    int(101)
    ["b"]=>
    int(2)
    ["c"]=>
    int(3)
    }
    }

  3. Quá tải phương thức
  4. Các cuộc gọi phương thức có thể bị quá tải khi sử dụng các phương thức __gọi, __lấy__bộ. Các phương thức này sẽ chỉ kích hoạt nếu đối tượng hoặc đối tượng được kế thừa không chứa phương thức đang được truy cập. Cú pháp:

    Trộn __gọi(tên chuỗi, đối số mảng)

    Sử dụng phương thức này, các phương thức lớp có thể được nạp chồng để thực thi mã tùy ý được xác định trong lớp. Đối số tên chứa tên của phương thức được gọi. Các đối số được truyền cho phương thức khi được gọi sẽ được trả về thông qua các đối số. Giá trị được trả về bởi phương thức __gọi(), sẽ được chuyển cho người gọi.

    Ví dụ về quá tải sử dụng __gọi:

    Người gọi lớp(
    riêng tư $x = mảng(1, 2, 3);

    Hàm __gọi ($m, $a) (
    in "Phương thức $m:\n được gọi";
    var_dump($a);
    trả về $this -> x ;
    }
    }

    $foo = Người gọi mới();
    $a = $foo -> test (1 , "2", 3.4 , true );
    var_dump($a);
    ?>

    Kết quả chạy ví dụ được xem xét:

    Phương pháp thử nghiệm được gọi là:
    mảng(4) (
    =>
    int(1)
    =>
    chuỗi(1) "2"
    =>
    phao(3.4)
    =>
    bool(đúng)
    }
    mảng(3) (
    =>
    int(1)
    =>
    int(2)
    =>
    int(3)
    }

  5. Giao diện

    Giao diện đối tượng cho phép lập trình viên viết mã chỉ định những phương thức và thuộc tính nào mà một lớp nên bao gồm mà không cần phải mô tả chức năng của chúng.

    Các giao diện được khai báo giống như các lớp thông thường nhưng sử dụng từ khóa " giao diện"; nội dung phương thức của giao diện phải trống. Để đưa giao diện vào một lớp, người lập trình phải sử dụng từ khóa " dụng cụ" và mô tả chức năng của các phương thức được liệt kê trong giao diện đi kèm. Nếu được yêu cầu, các lớp có thể bao gồm nhiều giao diện bằng cách liệt kê chúng, cách nhau bằng dấu cách.

    Nếu một lớp bao gồm một giao diện và không mô tả chức năng của tất cả các phương thức của giao diện đó thì việc thực thi mã bằng lớp đó sẽ thất bại kèm theo một lỗi nghiêm trọng cho biết phương thức nào không được mô tả. Ví dụ về giao diện:

    giao diện ITmẫu
    {
    hàm công khai setVariable ($name, $var);
    hàm công khai getHtml ($template);
    }

    Mẫu lớp triển khai Itemplate
    {
    riêng tư $vars = array();

    Hàm công khai setVariable ($name, $var)
    {
    $this -> vars [ $name ] = $var ;
    }

    Hàm công khai getHtml ($template)
    {
    foreach($this -> vars as $name => $value ) (
    $template = str_replace ("(" . $name . ")" , $value , $template );
    }

    Trả về mẫu $;
    }
    }
    ?>

  6. toán tử instanceof

    Hỗ trợ kiểm tra sự phụ thuộc vào các đối tượng khác. Hàm is_a(), được biết đến từ PHP 4, không còn được khuyến nghị nữa.

    if ($obj ví dụ của Circle ) (
    print "$obj là một hình tròn" ;
    }
    ?>

  7. phương pháp cuối cùng

    Từ khóa cuối cùng cho phép bạn đánh dấu các phương thức để lớp kế thừa không thể làm quá tải chúng. Bằng cách đặt một từ khóa trước khi khai báo các phương thức hoặc thuộc tính của một lớp cuối cùng, bạn có thể ngăn chúng bị ghi đè trong các lớp con, ví dụ:

    lớp BaseClass(
    kiểm tra chức năng công cộng() (
    tiếng vọng "Phương thức BaseClass::test() được gọi\n";
    }

    Hàm công khai cuối cùng moreTesting() (
    tiếng vọng "Phương thức BaseClass::moreTesting() được gọi là\n";
    }
    }

    Lớp ChildClass mở rộng BaseClass (
    chức năng công cộng moreTesting() (
    tiếng vọng "Phương thức ChildClass::moreTesting() được gọi là\n"<<< Назад

    Nội dung Chuyển tiếp >>>
    Nếu bạn có bất kỳ câu hỏi nào khác hoặc điều gì đó chưa rõ ràng - chào mừng bạn đến với chúng tôi