11 nhà phát triển PHP tự do tốt nhất [Thuê sau 48 giờ] – chuyên gia php

Toptal phân phối cho các nhà phát triển PHP, lập trình viên và kỹ sư PM hàng đầu trên nền tảng hợp đồng hàng tiếng đồng hồ, bán thời gian hoặc toàn thời gian. Khách hàng bao gồm Thumbtack, Bridgestone và Motorola.

Bạn đang xem : chuyên gia php

Thông dụng… đó chắc cú là một từ bạn có thể sử dụng để mô tả PHP liên quan đến website. Trong các ứng dụng website, phát triển website, phát triển ứng dụng – nó thực sự ở khắp nơi. Về từ ngữ lập trình phía máy chủ, cho đến nay, nó là từ ngữ được sử dụng rộng rãi nhất, phân phối năng lượng cho hơn 80% website hiện tại (với người đứng đầu tiếp theo là ASP.NET, chỉ kém 17%).

Vì sao? Điều gì làm cho PHP trở nên thông dụng và được sử dụng rộng rãi? Mặc dù không có câu trả lời duy nhất cho thắc mắc này, nhưng tính dễ sử dụng của PHP chắc cú là một yếu tố góp phần trọng yếu. Người mới sử dụng PHP có thể bắt kịp vận tốc và xây dựng nội dung động dựa trên PHP vào các website của họ với yêu cầu tối thiểu về chuyên môn lập trình.

Nhưng trong đó có rất nhiều thách thức trong việc tìm kiếm các nhà phát triển website PHP có tay nghề cao. Rào cản tham gia tương đối thấp và lịch sử 20 năm của PHP có nghĩa là các lập trình viên PHP thực tiễn đã trở nên thông dụng như chính công nghệ này. Tuy nhiên, trong lúc nhiều người có thể tuyên bố hợp pháp là “biết” PHP, những người là Chuyên Viên thực sự về từ ngữ này có khả năng tạo ra PM có khả năng mở rộng, tính năng, mạnh mẽ và dễ bảo trì hơn nhiều.

Vậy làm sao để bạn phân biệt những người có năng lực thực sự về lập trình PHP với những người chỉ có kiến ​​thức sơ lược, chứ đừng nói đến những người nằm trong top 1% ứng viên hàng đầu?

Hướng tới mục tiêu đó, hướng dẫn này phân phối một mẫu các thắc mắc hiệu quả để giúp nhận xét bề rộng và chiều sâu khả năng thông thạo PHP của ứng viên. Tuy nhiên, điều trọng yếu cần ghi nhớ là những thắc mắc mẫu này chỉ nhằm mục đích hướng dẫn. Không phải mọi ứng viên “A” đáng tuyển nhân sự đều có thể trả lời đúng toàn bộ, cũng như việc trả lời toàn bộ chúng đều không đảm bảo là ứng viên “A”. Cuối cùng, việc tuyển nhân sự vẫn là một môn văn nghệ cũng tương tự như một môn khoa học (xem phần Tìm kiếm những người ưu tú ).

Lưu ý rằng chúng tôi đã phấn đấu duy trì hướng dẫn này tập trung vào PHP hiện đại (tức là phiên bản 5.3 trở lên), nhưng có các tham chiếu đến các khái niệm và tính năng đã có từ lâu và nên thân thuộc với bất kỳ ai đủ điều kiện và kinh nghiệm Nhà phát triển PHP.

Các khái niệm và mô hình PHP chính

Có một số khái niệm và mô hình chính thiết yếu để một Chuyên Viên PHP bán thời gian hoặc toàn thời gian có thể thành thục. Dưới đây là một số ví dụ.

Hỏi: Mô tả một bao đóng trong PHP. Phân phối ví dụ về thời điểm, nguyên nhân và cách chúng có thể được sử dụng.

Closures trở nên hữu ích khi một số đoạn logic cần được thực hiện trong một phạm vi hạn chế nhưng vẫn giữ được khả năng tương tác với môi trường bên ngoài phạm vi đó. Khối xây dựng trước hết của một bao đóng là hàm ẩn danh, hoặc kiểu lambda, không có tên nào được link với nó. Ví dụ:

  # Đối số thứ 2 cho array_walk là một hàm ẩn danh
array_walk ($ array, function ($ dog) {
    echo $ dog- & gt; sủa ();
});
 

Mặc dù bản thân chúng không có tên nào được link với chúng, nhưng các hàm ẩn danh có thể được gán cho một biến hoặc được chuyển xung quanh dưới dạng lệnh gọi lại bởi các hàm bậc cao yêu cầu chúng. Ví dụ:

  # Xác nhận một hàm ẩn danh và gán nó cho một biến
# có tên $ dog_bark.
$ dog_bark = function ($ dog) {
    echo $ dog- & gt; sủa ();
};
array_walk ($ array, $ dog_bark);
 

Thông qua PHP, các hàm ẩn danh được triển khai bằng cách sử dụng lớp Closure .

Nội dung của một hàm ẩn danh tồn tại trong phạm vi riêng của chúng, độc lập với phạm vi mà chúng được tạo. Tuy nhiên, có thể ràng buộc rõ ràng một hoặc nhiều biến từ phạm vi bên ngoài để có thể tham chiếu trong hàm ẩn danh thông qua mệnh đề use trong khái niệm hàm. Hãy minh họa:

  class Dog {
    public function shell () {echo 'woof'; }
}

$ dog_bark = function ($ dog) sử dụng (& amp; $ cổ áo) {# ràng buộc theo tham chiếu
    if ($ cổ áo == 'fitWell') {
         echo $ dog- & gt; sủa (); # 'Gâu'
    } khác {
         echo 'không sủa'; # cổ áo quá chật để sủa
    }
};

$ dog = new Dog;

$ cổ áo = 'fitWell'; # nhân tố bên ngoài
$ dog_bark ($ con chó); # 'Gâu'

$ cổ áo = 'chật';
$ dog_bark ($ con chó); # 'không sủa'
 

Khả năng truy cập các biến bên ngoài này trong một bao đóng trở nên đặc biệt hữu ích khi sử dụng các hàm bậc cao hơn. Lấy ví dụ về array_walk của chúng tôiViệc sử dụng từ bên trên, giống như các hàm khác của loại này, hoạt động theo một cách rất rõ ràng và cụ thể trên các biến đề tài mà nó được truyền vào. Khi hàm lặp qua $ array , chỉ giá trị hiện tại và khóa được chuyển cho hàm gọi lại ẩn danh. Không có thời cơ để chuyển vào biến $ cổ áo nếu không có dấu đóng và mệnh đề use của nó. Chúng tôi có thể sử dụng từ khóa global , nhưng sẽ không thiết yếu làm ô nhiễm không gian tên chung bằng một biến chỉ có ý nghĩa trong phạm vi rất hạn chế của chúng tôi.

Closures cũng có thêm tác dụng hướng đối tượng. PHP 5.4 mang đến các phương thức mới cho giao diện của lớp Closure. Rõ ràng, các phương thức bind bindTo mới có thể được sử dụng để link với các đối tượng mới để đóng hoạt động, ví dụ:

  Closure :: bindTo ($ newthis, $ newscope);
 

Phương thức này sẽ thực sự sao chép chính nó và link phạm vi của nó với đối tượng mới đó, vì vậy $ this thực sự tham chiếu $ newthis trong ngữ cảnh đối tượng. Để giúp minh họa, hãy sửa đổi hàm $ dog_bark để sử dụng $ this và sau đó link nó với đối tượng Dog mới:

  # xác nhận bao đóng, nhưng chưa link với bất kỳ đối tượng nào
$ dog_bark = function () {
    echo $ this- & gt; sound; # đây là tài sản ở đâu
};
$ new_dog = new Dog ();
# hiện giờ tạo một bao đóng mới link với đối tượng $ new_dog
$ new_closure = $ dog_bark- & gt; bindTo ($ new_dog);
$ new_closure (); # vọng lại tiếng động
 

Thực tiễn là một bao đóng có thể được gán cho một biến và hiện có quyền truy cập vào $ this là khá mạnh mẽ. Đặc biệt, điều này có nghĩa là nó có thể trở thành một tính chất có thể gọi của một đối tượng khác và về cơ bản trở thành một phương thức của đối tượng đó. Ví dụ:

  $ dog = new Dog ();
$ dog- & gt; close = $ dog_bark;
$ dog- & gt; close ();
 

Điều này giúp bạn có thể thay đổi và thêm vào các khả năng hành vi của một đối tượng trong thời gian chạy mà không cần phải thay đổi chữ ký lớp xác nhận. Rất hữu ích khi cần nâng cấp tính năng nhưng không thể chạm vào mã thực tiễn hoặc khi nhu cầu về tính năng nâng cao bị hạn chế trong phạm vi.

Hỏi: Giải thích việc sử dụng và mục đích của từ khóa global trong PHP. Mang ra ví dụ về một trường hợp sử dụng nó là thích hợp cũng như một trường hợp không thích hợp.

Trong những ngày “PHP ra đời”, việc triển khai hướng đối tượng của từ ngữ này ít phức tạp hơn nhiều so với ngày nay. Do đó, không có gì lạ khi tìm thấy mã PHP cũ hơn “kế thừa” sử dụng khá rộng rãi từ khóa global . Theo nhiều cách, việc lạm dụng quá mức các biến toàn cục sẽ “đối mặt” với các phương pháp hay nhất về lập trình hướng đối tượng (OOP) hiện đại, vì nó có thể dẫn theo sự phụ thuộc hòa trộn giữa các lớp, khó tách các nhà cung cấp logic khác nhau khỏi nhau và ô nhiễm không gian tên toàn cục với các biến không (hoặc rất hạn chế) sử dụng trong ngữ cảnh đó.

Hãy xem xét ví dụ đơn giản sau:

  class Dog {
    hàm vỏ () {
        toàn thế giới $ tiếng động;
        trả về $ âm thanh- & gt; sủa ();
    }
}
 

Điều này giới thiệu một phần phụ thuộc ẩn của lớp Dog vào đối tượng $ sound chung. Mặc dù có thể có những trường hợp điều này là hợp lý (ví dụ: một hệ thống có một bộ tiếng động được xác nhận rõ ràng và không khi nào được sửa đổi), nói chung, sẽ tốt hơn nhiều nếu chuyển một cách rõ ràng các $ tiếng động đối tượng với phương thức khởi tạo của lớp Dog , sau đó sẽ được lưu trữ và sử dụng trong phiên bản đó của lớp; ví dụ:

  class Dog {
    tiếng động được bảo vệ;
    function __construct ($ tiếng động) {
        $ this- & gt; tiếng động = $ tiếng động;
    }

    tính năng công khai vỏ () {
        trả về $ this- & gt; getSounds () - & gt; sủa ();
    }

    hàm công khai getSounds () {
        trả về tiếng động $ this- & gt;;
    }
}
 

Nhưng cũng đúng với hầu như mọi thứ trong mã hóa, đừng khi nào nói không khi nào. Trên thực tiễn, có một số sản phẩm mạnh mẽ và ổn định được viết bằng PHP sử dụng nhiều các hình cầu. WordPress Codex , phân phối khoảng 20% ​​số website trên website (và đang tăng trưởng hàng năm), Joomla! 1.5 (vẫn đang được sử dụng rộng rãi) và hệ thống iLance Enterprise Auction đều là ví dụ về các dự án đã tồn tại trong nhiều năm và sử dụng toàn thế giới 'trưởng thành'. Tương tự, có thể có những tình huống mà việc sử dụng các khối cầu trong mã của các bạn là thích hợp, nhưng việc sử dụng chúng phải luôn thận trọng.

Hỏi: Mô tả không gian tên trong PHP và vì sao nó lại hữu ích.

Một trong những bổ sung mới hơn để trợ giúp OOP của PHP là không gian tên . Như tên của nó, không gian tên xác nhận phạm vi trong chương trình mà khái niệm lớp, giao diện, hàm, biến và hằng số sẽ không tạo ra xung đột tên với các mục có tên tương tự trong không gian tên khác.

Trước PHP 5.4, tên lớp thường trở nên khá dài để tìm cách khớp với cấu trúc phân cấp gói và tránh xung đột tên. Ví dụ: giả sử tất cả chúng ta có một lớp Dogs được xác nhận trong mô hình của ứng dụng Dog_Pound . Nếu không có vùng chứa tên, chúng tôi có thể cảm thấy bắt buộc phải phân phối một tên dài cho lớp của mình, ví dụ như sau:

  class Dog_Pound_Model_Dogs {# wow, thật ngon!
    hàm getDogs ();
}
 

Không gian tên giúp giảm bớt vấn đề này bằng cách cho phép nhà phát triển chỉ định rõ ràng không gian tên mà trong đó toàn bộ các mục được đặt tên (lớp, biến, 𝒱.𝒱.) sẽ được xác nhận. Với không gian tên, tên lớp dông dài ở trên có thể được thay thế bằng:

  không gian tên dog_pound  model; # chỉ định không gian tên hiện tại

class Dogs {# only "Dogs" được xác nhận trong dog_pound  model
    hàm getDogs ();
}

$ dog = new Dogs; # rõ ràng vì chỉ có một trong không gian tên này
 

Tham chiếu không gian tên tương đối cũng được trợ giúp. Ví dụ: khi ở trong vùng tên dog_pound , bạn có thể sử dụng phần sau để khởi tạo lớp của mình:

  $ dog = new model  Dogs # chỉ một "mô hình" được xác nhận trong dog_pound
 

Ngoài ra, các mục được đặt tên trong không gian tên khác có thể được nhập vào các tệp khác và sau đó có thể được tham chiếu trực tiếp. Điều này được thực hiện thông qua toán tử sử dụng như sau:

  không gian tên this  new  namespace; # không gian tên hiện tại của chúng tôi

# nhập Chó từ không gian tên dog_pound  model và tham chiếu nó
sử dụng dog_pound  model  Dogs;

$ dog = new Dogs;
 

Hỏi: Đặc tính là gì? Mô tả các đặc tính chính của chúng và vì sao chúng hữu ích. Cho một ví dụ về khai báo đặc tính và một lớp sử dụng nhiều đặc tính.

Đặc tính là một bổ sung tuyệt vời cho PHP 5.4 cho phép các hành vi được thêm vào một lớp mà không cần mở rộng lớp cha để kế thừa tính năng muốn (trước PHP 5.4, điều này chỉ có thể là được thực hiện thông qua mẫu lớp mixin trong thời gian chạy). Ngoài ra, bạn có thể sử dụng nhiều Đặc tính trong một lớp. Điều này làm cho chúng trở thành một trợ giúp đắc lực trong việc tổ chức và loại bỏ các mối quan tâm trong nền tảng mã và do đó, giúp tôn trọng phép tắc thiết kế thành phần hơn là tính kế thừa .

Dưới đây là một số ví dụ về khái niệm đặc tính đơn giản:

  đặc tính Trào lưu {
    public function topSpeed ​​() {
        $ this- & gt; speed = 100;
        echo "Đang chạy 100%!" . PHP_EOL;
    }
    hàm công khai stop () {
        $ this- & gt; speed = 0;
        echo "Đã ngừng di chuyển!" . PHP_EOL;
    }
}

đặc tính Nói {
    public function makeSound () {
        echo $ this- & gt; sound. PHP_EOL;
    }
}
 

Từ khóa use một lần nữa được sử dụng, lần này để nhập từ một không gian tên khác để bao gồm một hoặc nhiều đặc tính trong khái niệm lớp. Ví dụ:

  class Dog {
    sử dụng Trào lưu, Nói; // Dog hiện có những khả năng này!

    tiếng động được bảo vệ;
    
    function __construct () {
        $ this- & gt; sound = 'sủa';
    }
}

$ dog = new Dog ();
$ dog- & gt; topSpeed ​​(); // từ đặc tính chuyển động
$ dog- & gt; stop (); // từ đặc tính chuyển động
$ dog- & gt; makeSound (); // từ Nói đặc tính
 

PHP trong tầm tay của các bạn

Cam kết ghi nhớ những gì có thể đơn giản tìm thấy trong đặc tả từ ngữ hoặc tài liệu API không phải là dấu hiệu cho thấy mức độ thành thục. Nhưng điều đó nói lên rằng, một người nào đó thân thuộc với một từ ngữ lập trình sẽ có các cụ thể và sắc thái về cú pháp và tính năng của nó trong tầm tay của họ. Dưới đây là một số thắc mắc giúp nhận xét khía cạnh chuyên môn của ứng viên.

Hỏi: Mô tả mối quan hệ giữa php: // input $ _POST . Bạn sẽ truy cập luồng php: // input như vậy nào?

Theo thuật ngữ đơn giản nhất, superglobal $ _POST là nội dung được định dạng hoặc phân tích cú pháp của phần nội dung của một yêu cầu được gửi đến máy chủ bằng phương thức đăng.

  POST /php-hiring-guide/php-post.php HTTP / 1.1
Máy chủ: toptal.com
Người giới thiệu: http: ///toptal.php/php-hiring-guide/php.php
Content-Type: application / x-www-form-urlencoded
Nội dung-Độ dài: 63
article_name = Hướng dẫn tuyển nhân sự PHP & amp; tag_line = Bạn được thuê! & amp; action = Gửi
 

Có thể truy cập nội dung của yêu cầu thông qua luồng đầu vào của PHP giống như bất kỳ tệp nào khác:

  $ input = file_get_contents ("php: // input");
 

Hỏi: Đặt tên và xác nhận tối thiểu năm siêu cầu khởi đầu bằng $ _ . Mô tả mối quan hệ của chúng với biến $ GLOBALS .

  • $ _POST - một hàm băm của các cặp giá trị khóa được gửi đến máy chủ bằng phương thức "post"
  • $ _GET - một hàm băm của các cặp giá trị khóa được gửi đến máy chủ bằng phương thức "get"
  • $ _REQUEST - sự phối hợp của $ _GET $ _POST
  • $ _SERVER - một hàm băm của các biến do máy chủ website đặt rõ ràng và cụ thể và có liên quan tới việc thực thi chương trình
  • $ _ENV - một hàm băm của các biến liên quan đến máy chủ và cấu hình của máy chủ
  • $ _SESSION - một hàm băm của các biến có nghĩa là được duy trì giữa các lần xem trang hoặc các lần thực thi ứng dụng tách biệt
  • $ _COOKIE - một hàm băm của các biến sẽ được lưu trữ với ứng dụng khách
  • $ _FILES - một loại băm yêu cầu đặc biệt chứa dữ liệu đầu vào liên quan đến một tập hợp tệp đã tải lên

Tương tự như từ khóa toàn thế giới trong PHP là biến siêu toàn thế giới $ GLOBALS . Như tên cho thấy, superglobals là các biến toàn thế giới tự động và như vậy được lưu trữ trong $ GLOBALS . Ví dụ: siêu cầu thủ $ _ENV có thể được truy cập theo cách khác qua $ GLOBALS ["_ ENV"] .

Hỏi: Giải thích mục đích và cách sử dụng của __get , __set , __isset , __unset , __ call __callStatic phương thức “ma thuật”. Mỗi loại nên được sử dụng khi nào, như vậy nào và vì sao (và có thể là vì sao không)?

Bốn phương pháp trước hết trong danh sách của chúng tôi, __get , __set , __isset __unset được sử dụng cho quá tải tính chất của một đối tượng. Chúng cho phép chúng tôi xác nhận cách toàn cầu bên ngoài có thể tương tác với các tính chất có cơ chế hiển thị riêng tư hoặc được bảo vệ và các tính chất thậm chí không tồn tại trong đối tượng của chúng tôi.

  # 'rikers' không được khái niệm trong lớp Dog nhưng được xử lý bởi
# phương thức lớp Dog '__get như sau:
function __get ($ name) {
    if ($ name == 'râu') {
        # chỉ tạo một râu
        if (! Isset ($ this- & gt; whiskersService)) {
            $ this- & gt; whiskersService = new Whiskers ($ this);
        }
        # vì vậy các lệnh gọi đến 'râu' sẽ tải các hàm khôn ngoan
        return $ this- & gt; whiskersService- & gt; load ();
    }
}
 

Sau đó, người gọi có thể chỉ cần truy xuất tính chất râu như sau:

  $ hair = $ dog- & gt; rikers;
 

Bằng cách sử dụng phương thức __get để “chặn” tham chiếu này đến tính chất hình như công khai, chúng tôi có thể che khuất cụ thể triển khai của một hoặc nhiều tính chất của đối tượng.

Việc sử dụng phương thức __set cũng tương tự. Ví dụ:

  function __set ($ name, $ value) {
    if ($ name == 'râu') {
        if ($ value instanceOf Whisker) {
            $ this- & gt; whiskersService- & gt; setData ($ value);
            trả về $ this- & gt; whiskersService- & gt; getData ();
        } khác {
            ném WhiskerException mới ("Đó không phải là một cái râu");
            trả về sai;
        }
    }
}
 

Sau đó, người gọi có thể chỉ cần đặt tính chất ria như vậy:

  $ dog- & gt; whiskers = $ hair;
 

Câu lệnh này tự động gọi phương thức __set , sử dụng 'whiskers' làm đối số trước hết và phía bên phải của phép gán làm đối số thứ hai.

Cuối cùng, các phương thức __isset __unset hoàn thiện bộ tứ. Mỗi đối số chỉ nhận một đối số, $ name của tính chất sẽ được nhìn nhận hoặc vận hành; ví dụ:

  function __isset ($ name) {
    if ($ name == 'râu') {
        return (bool) is_object ($ this- & gt; whiskersService) & amp; & amp;
                                ! rỗng ($ this- & gt; whiskersService- & gt; getData ());
    }
}

function __unset ($ name) {
    if ($ name == 'râu' & amp; & amp; is_object ($ this- & gt; whiskersService)) {
        # chúng tôi không muốn kết thúc hoàn toàn dịch vụ:
        $ this- & gt; whiskersService- & gt; reset ();
    }
}
 

Hai phương thức khác, __call __callStatic , thực hiện một tính năng tương tự cho các lớp, nhưng phân phối cho chúng tôi quá tải phương thức . Thông qua việc sử dụng chúng, tất cả chúng ta có thể xác nhận cách một lớp sẽ phản ứng khi một phương thức không xác nhận, được bảo vệ hoặc riêng tư được gọi.

Trong quá trình triển khai __call mà chúng tôi muốn đảm bảo toàn bộ các lệnh gọi phương thức “không hiển thị” đều được trả về trọng tải từ whiskersService , chúng tôi có thể làm điều gì đó như:

  public function __call ($ method, $ args) {
    return $ this- & gt; whiskersService- & gt; load ();
}
 

__callStatic có các đối số giống nhau, tính năng giống nhau và cho phép tương tác này giống nhau, nhưng bên ngoài ngữ cảnh đối tượng rõ ràng và cụ thể. Điều này có nghĩa là nếu tất cả chúng ta đã khái niệm phương thức này, tất cả chúng ta có thể sử dụng cú pháp ClassName :: notVosystemMethod () ; ví dụ:

  public function __callStatic ($ method, $ args) {
    if (! is_object (static :: $ whiskersService)) {
        static :: $ whiskersService = new Whiskers (__ CLASS__);
    }
    trả về static :: $ whiskersService- & gt; load ();
}

$ lông = Chó :: râu ();
 

Trong tập hợp các ví dụ trên, chúng tôi đã gói gọn râu triển khai từ toàn cầu bên ngoài và biến nó thành đối tượng khả dụng duy nhất được hiển thị theo phương pháp này. Ứng dụng khách của các tính chất và phương thức như vậy không cần biết bất kỳ điều gì về whiskersService cơ bản hoặc cách lớp Dogs lưu trữ dữ liệu của nó.

Nói chung, những phương pháp này giúp tất cả chúng ta tăng khả năng bố cục đối tượng một cách linh hoạt. Thời dịp để trừu tượng hóa và đóng gói đối tượng và do đó có thể sử dụng lại mã nhỏ gọn hơn (và cuối cùng là một hệ thống dễ quản lý hơn) cũng tăng trưởng.

Tuy nhiên, cần thận trọng khi sử dụng các phương pháp tiện lợi này, vì lợi nhuận có thể đi kèm với cái giá phải trả. Chúng chậm hơn so với truy cập thẳng vào một tài sản công cộng khác được đề cập và cũng chậm hơn so với getters và setters đã xác nhận. Chúng cũng cản trở việc sử dụng các khả năng hữu ích nhất định (ví dụ như phản ánh đối tượng , tự động hoàn thiện trong IDE của các bạn, các tiện ích tài liệu tự động như PHPDocumentor, 𝒱.𝒱.). Vì vậy, nếu đây là những nền tảng bạn muốn hoặc cần dựa vào, bạn có thể xem xét việc xác nhận các phương thức và tính chất một cách rõ ràng. Như với hầu như mọi thứ, không có câu trả lời đúng toàn diện. Những ưu và nhược điểm nên được nhìn nhận theo từng trường hợp rõ ràng và cụ thể.

Hỏi: Mô tả một hoặc nhiều cấu trúc dữ liệu Thư viện PHP chuẩn (SPL). Mang ra các ví dụ sử dụng.

Hầu như phát triển PHP đều khắc phục việc lấy và xử lý dữ liệu từ nguồn này hay nguồn khác, ví dụ như DataBase cục bộ, tệp cục bộ, API từ xa, 𝒱.𝒱. Do đó, các nhà phát triển tiêu xài rất nhiều thời gian lấy, sắp xếp, di chuyển và thao tác dữ liệu đó. Trong một số trường hợp, một mảng sẽ không giảm thiểu nó về năng suất và sử dụng bộ nhớ lưu trữ, do đó, cấu trúc dữ liệu tốt hơn được yêu cầu.

Ngoài ra, với rất nhiều cuộc thảo luận và tập trung vào các khuôn khổ (trang này có thể chứa đầy tên của các khuôn khổ PHP như CakePHP và Codeigniter!), có thể khó tìm được một nhà phát triển có nhiều kinh nghiệm với một khuôn khổ rõ ràng và cụ thể mà dự án của các bạn đang sử dụng. Hiệu quả thực sự của một cộng đồng phát triển tích cực như vậy là sự phân bổ của các nhà phát triển làm việc với một khuôn khổ rõ ràng và cụ thể khởi đầu thu hẹp lại và có thể khiến bạn khó tìm thấy tuyệt kỹ rõ ràng và cụ thể đó hơn.

Một ngành nghề cần tập trung và nơi bạn chắc cú rằng một nhà phát triển PHP thành thục sẽ thân thuộc, này là việc sử dụng và trang điểm giống nhau của Thư viện PHP Chuẩn (SPL) . Nếu ứng viên có kiến ​​thức nền tảng vững chắc ở đây, thời cơ thành công để ứng viên đó làm việc và tăng trưởng giá trị cho ứng dụng của các bạn sẽ to hơn, bất kể khuôn khổ rõ ràng và cụ thể đang được sử dụng trong môi trường của các bạn là gì.

Rõ ràng, ứng viên phải thân thuộc với một số hoặc toàn bộ chín cấu trúc dữ liệu SPL được liệt kê trong Hướng dẫn sử dụng PHP. Nhiều loại phân phối tính năng rất giống nhau, nhưng các biến thể nhỏ làm cho mỗi loại hoàn toàn thích hợp hơn với một mục đích sử dụng rõ ràng và cụ thể. Dưới đây là tổng quan ngắn gọn:

  • SplDoublyLinkedList . Mỗi phần tử trong danh sách này giữ các link đến nút trước nó và nút sau nó trong danh sách. Hình dung rằng bạn đang xếp hàng tại ngân hàng, nhưng bạn chỉ có thể nhìn thấy người phía trước và người phía sau bạn. Điều đó tương tự với mối quan hệ "liên kết" giữa các phần tử trong SplDoublyLinkedList . Chèn một phần tử vào danh sách tương tự như ai đó đang cắt trước mặt bạn tại ngân hàng (nhưng sau đó bạn đột nhiên quên mất ai đang ở trước mặt bạn và người đó cũng quên bạn hoàn toàn). Cho phép chuyển hóa hiệu quả thông qua một tập dữ liệu và cho phép bạn liệt kê và thêm một lượng lớn dữ liệu mà không cần phải băm lại nội bộ.
  • SplQueue SplStack . Rất giống với SplDoublyLinkedList SplQueue SplStack . Cả hai về cơ bản đều là SplDoublyLinkedLists với các cờ trình lặp khác nhau ( IT_MODE_LIFO là “Last In First Out” và IT_MODE_FIFO là “First In First Out”) , chi phối thứ tự mà các phần tử được đọc và phải làm gì với các phần tử đó sau khoảng thời gian chúng đã được xử lý. Một điểm nhấn khác là API SplQueue có thể được xem là trực quan hơn một tí, phân phối phương thức enqueue () (thay vì push () ) và phương thức dequeue () (thay vì shift () ).
  • SplHeap . Được trình diễn bên trong dưới dạng cây nhị phân, trong đó mỗi nút trong cây có tối đa hai nút con. Nó là một lớp trừu tượng phải được mở rộng để khái niệm phương thức so sánh () . Sau đó, phương pháp này được sử dụng để thực hiện sắp xếp theo thời gian thực bất kì khi nào một giá trị được chèn vào cây.
  • SplMaxHeap SplMinHeap . Triển khai rõ ràng và cụ thể của lớp trừu tượng SplHeap . SplMaxHeap phân phối một so sánh ()Phương thức duy trì các giá trị theo thứ tự từ cao nhất đến thấp nhất, trong lúc SplMinHeap phân phối phương thức so sánh () để duy trì các giá trị theo thứ tự từ thấp nhất đến cao nhất.

  • SplPooterQueue . Tương tự như SplHeap , nhưng việc sắp xếp được thực hiện dựa trên giá trị "ưu tiên" bổ sung được phân phối cho mỗi thành viên.
  • SplFixedArray . Tương tự như một mảng thông thường, nhưng các chỉ số chỉ có thể là số nguyên và độ dài của mảng là cố định. Nó phân phối vận tốc được cải tổ khi triển khai một mảng. Không có lợi nhuận về vận tốc xử lý so với một mảng, giao diện được tối ưu hóa để các đối tượng không cần phải được băm theo cách thủ công khi thêm các phần tử.
  • SplObjectStorage . Phân phối một giao diện để ánh xạ các đối tượng với dữ liệu hoặc chỉ đơn giản là phân phối một vùng chứa cho một tập hợp các đối tượng. Về cơ bản, nó có thể sử dụng một đối tượng giống như một khóa mảng phối hợp để link đối tượng đó với một số dữ liệu hoặc hoàn toàn không có dữ liệu.

Hỏi: $ Ҳ sẽ bằng bao nhiêu sau câu lệnh $ Ҳ = 3 + "15%" + "$ 25" ?

Câu trả lời đúng là 18. Hiện tại, hãy giải thích nguyên nhân vì sao.

PHP trợ giúp chuyển hóa kiểu tự động dựa trên ngữ cảnh mà một biến hoặc giá trị đang được sử dụng.

Nếu bạn thực hiện một phép toán số học trên một biểu thức có chứa một chuỗi, chuỗi đó sẽ được hiểu là kiểu số thích hợp cho mục đích nhận xét biểu thức. Vì vậy, nếu chuỗi khởi đầu bằng một hoặc nhiều ký tự số, phần sót lại của chuỗi (nếu có) sẽ bị bỏ qua và giá trị số được hiểu là kiểu số thích hợp. Mặt khác, nếu chuỗi khởi đầu bằng một ký tự không phải số, thì nó sẽ được nhìn nhận là 0.

Với sự hiểu biết đó, tất cả chúng ta có thể thấy rằng "15%" nhận xét giá trị số 15 và "$ 25" nhận xét giá trị số 0, điều này giải thích vì sao kết quả của câu lệnh $ Ҳ = 3 + "15%" + "$ 25" là 18 (tức là 3 + 15 + 0).

Tùy thuộc vào người bạn yêu cầu, chuyển hóa kiểu tự động là một tính năng tuyệt vời hoặc là một trong những cạm bẫy tồi tệ nhất của từ ngữ PHP. Mặt khác, khi được sử dụng một cách có ý thức và đúng cách, nó có thể rất thuận tiện cho nhà phát triển (ví dụ: tôi không cần phải viết bất kỳ mã nào để chuyển hóa “15” thành 15 trước khi sử dụng nó trong một phép tính số học). Mặt khác, nó có thể đơn giản dẫn theo khó khăn và khó tìm thấy lỗi khi vô tình được sử dụng, vì không có thông báo lỗi hoặc thông báo nào được tạo ra.

Hỏi: Giải thích tầm trọng yếu của việc sử dụng từ khóa static khi gọi một phương thức hoặc tính chất, kể cả việc nó khác với từ khóa self như vậy nào? Bạn sẽ sử dụng nó khi nào và vì sao? Phân phối một ví dụ.

Kể từ PHP 5.3.0, PHP triển khai một tính năng được gọi là link tĩnh muộn . “Liên kết muộn” xuất phát từ thực tiễn là static :: sẽ không được khắc phục bằng cách sử dụng lớp nơi phương thức được khái niệm mà sẽ được xác nhận bằng cách sử dụng phạm vi và thông tin thời gian chạy. (Ngẫu nhiên, thuật ngữ “tĩnh” hơi bị nhầm lẫn ở chỗ điều này không chỉ hạn chế ở việc được sử dụng với các phương thức tĩnh.)

Hãy xem xét ví dụ sau:

  class Dog {
    static $ whoami = 'dog';
    static $ sound = 'sủa';

    function makeSounds () {
        echo self :: makeSound (). ',';
        echo static :: makeSound (). PHP_EOL;
    }

    function makeSound () {
        echo tĩnh :: $ whoami. ''. static :: $ sound;
    }
}

Con chó :: makeSounds ();
 

Không có gì đáng ngạc nhiên khi điều này sẽ xuất ra "chó sủa, chó sủa".

Nhưng hiện giờ hãy mở rộng ví dụ này để bao gồm những điều sau:

  class Con chó con mở rộng con chó {
    static $ whoami = 'con chó con';
    static $ sound = 'gâu gâu';

    function makeSound () {
        echo tĩnh :: $ whoami. 'thút thít';
    }
}

Con chó con :: makeSounds ();
 

Bạn có thể ngạc nhiên khi biết rằng điều này sẽ tạo ra “tiếng chó con gâu gâu, tiếng chó con rên rỉ”. Để hiểu nguyên nhân, hãy truy cập lại phương thức makeSounds () trong lớp Dog .

Phương thức makeSounds () trong lớp Dog trước hết gọi self :: makeSound () . self :: hướng dẫn PHP luôn sử dụng phạm vi của cùng một lớp (trong trường hợp này là lớp Dog ). Do đó, việc gọi self :: makeSound () từ bên trong phương thức makeSounds () của Dog sẽ luôn gọi Dog phiên bản của makeSound () . Điều này đúng ngay cả khi tất cả chúng ta gọi Puppy :: makeSounds () Puppy không có phương thức makeSounds () của riêng nó và thay vào đó dựa vào < phiên bản của code> Dog . Đây là nguyên nhân vì sao lệnh gọi từ Puppy :: makeSounds () đến self :: makeSound () cho ra “tiếng chó con”.

Tiếp theo, phương thức makeSounds () trong lớp Dog gọi static :: makeSound () . static :: hoạt động khác với self :: . static :: hướng dẫn PHP sử dụng phiên bản trong phạm vi của lớp đã gọi phương thức trong thời gian chạy (trong trường hợp này là lớp Puppy ). Do đó, khi lệnh gọi đến static :: makeSound () được thực hiện, nó sẽ gọi phiên bản của phương thức đó của Puppy . Đây là nguyên nhân vì sao lệnh gọi từ Puppy :: makeSounds () đến static :: makeSound () cho ra “tiếng chó con”.

PHP Under-the-Hood

Hiểu phương thức hoạt động của PHP “ẩn” là một trong những đặc tính xác nhận chính của một Chuyên Viên PHP. Một ứng viên như vậy sẽ không chỉ hiểu cách thực hiện một việc gì này mà còn tồn tại các lựa chọn khác nhau có sẵn cũng như năng suất và sự phân tách tính năng của từng loại.

Hỏi: PHP xây dựng một mảng trong nội bộ như vậy nào?

Trung tâm của phần lớn sự phát triển PHP là mảng. Chúng tốt cho hầu như các mục đích sử dụng khi cần cấu trúc dữ liệu có thể lặp lại. Bên trong PHP, các mảng được lưu trữ, giống như nhiều cấu trúc dữ liệu khác, dưới dạng bảng băm. PHP được viết bằng ₵ trong đó không có cái gọi là mảng phối hợp: mảng trong ₵ chỉ có thể có các chỉ số nguyên. Do đó, một hàm băm được sử dụng để dịch các chỉ số mảng PHP (cả số nguyên và chuỗi) thành các chỉ số số thích hợp và các giá trị của mảng được lưu trữ tại vị trí hoặc nhóm đó trong bảng băm.

Quá trình tìm kiếm các mục nhập nhóm dựa trên hàm băm của các khóa mảng có độ phức tạp Σ (1) (sử dụng ký hiệu Big Σ ). Điều này bởi vì không cần lặp lại hàm băm, vì hàm băm tạo ra vị trí chuẩn xác trong bảng. (Lưu ý rằng điều này sẽ thay đổi một tí nếu có nhiều hơn một phần tử trong nhóm.)

PHP tự động tăng kích thước của một mảng “theo yêu cầu”. Rõ ràng, khi một phần tử được thêm vào một mảng, nếu việc thêm phần tử sẽ khiến mảng vượt quá kích thước được cấp phát hiện tại của nó, thì PHP sẽ phản hồi bằng cách tăng gấp đôi phân bổ bộ nhớ lưu trữ. Do đó, bảng băm tương ứng cần được băm lại hoàn toàn.

Hãy xem xét điều đó có nghĩa là gì trong một giây: Việc thêm giá trị vào một mảng trong một số trường hợp có thể phức tạp như việc lặp lại toàn thể mảng mới đó và trong cùng tình huống đó, bạn đã tăng gấp đôi dung tích bộ nhớ lưu trữ của cấu trúc đó. Do đó, khi các bộ dữ liệu khởi đầu trở nên lớn và bộ nhớ lưu trữ là một vấn đề, có thể là khôn ngoan khi xem xét một phương án thay thế cho một mảng, nơi việc tải dữ liệu để xử lý diễn ra trên nền tảng thiết yếu hơn.

Hỏi: Sự khác biệt giữa ArrayAccess ArrayObject là gì?

ArrayAccess chỉ đơn giản là một khái niệm giao diện yêu cầu bất kỳ lớp nào triển khai nó xác nhận các phương thức sau: offsetGet , offsetSet , offsetExists offsetUnset .

Mặt khác,

ArrayObject là một lớp có thể khởi tạo thực thi giao diện ArrayAccess . Một cách sử dụng tiện lợi của ArrayObject là các phần tử của nó có thể được truy cập giống như một mảng chuẩn (tức là thông qua ký hiệu [] thân thuộc; ví dụ: $ dog ['sound'] ) hoặc qua phương thức offsetGet (propertyName) (ví dụ: $ dog- & gt; offsetGet ('sound') ).

Hỏi: Máy phát điện là gì? Khi nào bạn có thể sử dụng nó thay vì một trình lặp hoặc một mảng thuần túy. output send làm gì?

Trình tạo trông giống như bất kỳ hàm nào khác trong PHP và có một số điểm tương đồng với các hàm đóng. Khi được gọi lần trước hết trong ngữ cảnh có thể lặp lại (ví dụ: một câu lệnh foreach), trình tạo trả về một đối tượng là một trổ tài của lớp Generator, đến lượt nó sẽ triển khai giao diện Iterator. Các giá trị cho phép lặp được tạo trong thời gian thực loại bỏ nhu cầu tải toàn thể tập dữ liệu vào bộ nhớ lưu trữ trước khi thực hiện. Điều đó có nghĩa là kết quả có thể được lặp lại theo cùng một cách mà một mảng có thể làm được, nhưng với một số khác biệt trọng yếu; rõ ràng và cụ thể là họ:

  • Chỉ có thể được sử dụng khi chạy về phía trước, nghĩa là không thể lặp lại các giá trị hoặc khởi đầu lại từ đầu. Việc gọi phương thức rewind () trên trình tạo sẽ tạo ra một ngoại lệ.
  • Chậm hơn so với việc xử lý một mảng được điền trước (trình tạo đang thực hiện thêm quá trình xử lý để tạo ra giá trị).
  • Bộ nhớ lưu trữ cực kỳ hiệu quả.

Một trong những điểm nhấn trung tâm hàm trình tạo và các hàm hoặc hàm PHP khác là chúng không sử dụng return để phân phối kết quả của chúng. Thay vào đó, output được sử dụng để chuyển các giá trị ra khỏi trình tạo (ví dụ: output $ dog; ). Trên thực tiễn, việc chỉ định giá trị trên câu lệnh return trong trình tạo sẽ tạo ra lỗi phân tích cú pháp, nhưng câu lệnh return trống sẽ chỉ dừng hoàn toàn trình tạo.

lợi nhuận tạm dừng thực thi và trả về giá trị hiện tại cho phạm vi của cấu trúc đang sử dụng trình tạo. Cấu trúc đó có thời cơ gửi thông tin trở lại trình tạo tại cùng thời điểm thực thi nó thông qua phương thức send (ví dụ: $ generate- & gt; send (-1); ).

Với phần giải thích cơ bản đó, hãy cùng xem một ví dụ đơn giản về cách sử dụng máy phát điện.

Trước nhất, hãy xác nhận trình tạo của chúng tôi:

  function dog_generator () {
    foreach (range (0, 2) as $ value) {
        # một số nguồn dữ liệu giả mạo
        $ dog = DogHelper :: getDogFromDataSource ($ value);
        # khởi đầu vào từ gửi hoặc sử dụng $ dog
        $ input = (lợi nhuận $ dog);
        if ($ input == -1) {
            trở về; // dừng trình tạo
        }
    }
}
 

Lưu ý rằng, trong ví dụ trên, chúng tôi đang gán kết quả của lệnh gọi phương thức output cho một biến và do đó phải đặt output trong dấu ngoặc đơn theo thứ tự hợp lệ về mặt cú pháp.

Và hiện giờ đây là một ví dụ về cách chúng tôi sử dụng trình tạo ở trên:

  # Lấy một phiên bản của trình tạo và gán nó cho một biến
$ máy phát điện = dog_generator ();

foreach ($ Trình tạo dưới dạng $ dog) {# $ dog là kết quả của 'năng suất'
    echo $ con chó. PHP_EOL;
    // chúng tôi muốn tìm con chó săn
    if ($ dog == 'Terrier') {
        # gửi một đầu vào vào trình tạo thông qua 'năng suất'
        $ create- & gt; send (-1);
        echo 'Chúng tôi đã tìm thấy Terrier, hãy dừng chương trình lại.';
    }
}
 

Khi chúng tôi chạy đoạn mã trên, ví dụ của chúng tôi dừng lại khi nó tìm thấy "Terrier". Ví dụ:

  Dalmatian
Terrier
Chúng tôi đã tìm thấy Terrier, hãy dừng chương trình lại.
 

Các lợi nhuận chính của trình tạo là dễ triển khai, tăng khả năng đọc mã và cải tổ năng suất tổng thể cũng như việc sử dụng bộ nhớ lưu trữ.

Vì vậy, nói chung, tốt nhất là sử dụng trình tạo mà không cần phải tua đi tua lại hoặc lặp lại các giá trị trong phần khác của chương trình. Mặt khác, nếu bộ nhớ lưu trữ không phải là vấn đề đáng lo ngại, thì một mảng giá trị đơn giản sẽ nhanh hơn nhiều.

Bức tranh lớn

Hỏi: Liệt kê một số điểm nhấn trung tâm (hoặc các bổ sung và nâng cấp tuần tự cho) PHP 5.3, PHP 5.4 và PHP 5.5.

PHP 5.3 đã được phát hành trở lại vào tháng 6 năm 2009 nhưng vẫn đang được lưu hành rộng rãi. Các tính năng mới chính trong bản phát hành này bao gồm: bao đóng, hàm kiểu lambda, không gian tên và link tĩnh muộn.

PHP 5.4 được phát hành vào tháng 3 năm 2012, giới thiệu các Đặc tính, cũng như khả năng khai báo một mảng với cú pháp [] rút gọn (ví dụ: $ array = ['shih tzu', 'rottweiler'] ). Ngoài ra, register_globals đã bị xóa trong phiên bản này.

PHP 5.5 được phát hành vào tháng 6 năm 2013 và là phiên bản hiện tại. Phiên bản này bổ sung trợ giúp cho các trình tạo (và các từ khóa liên quan đến lợi nhuận và gửi của chúng), cũng như thêm cuối cùng vào cú pháp xử lý ngoại lệ try / catch. APC Cache đã thay thế cho OpCache (dựa trên Zend Optimizer). PHP 5.5 cũng mang mảng theo nghĩa đen hơn nữa và trợ giúp cú pháp như ['shih tzu', 'rottweiler'] [1] (trả về "rottweiler") cũng như ký hiệu tiện lợi của các chuỗi được thông dịch dưới dạng mảng (ví dụ: '6, 5, 4' [0] , trả về "6").

Kết thúc

Tìm kiếm các nhà phát triển PHP chuyên dụng ở Hoa Kỳ hoặc nước ngoài có thể tương đối đơn giản, nhưng việc tìm kiếm các nhà phát triển PHP xuất sắc có khả năng xây dựng CRM, sửa đổi CMS, phát triển ứng dụng hoặc không chỉ có thế là một thách thức lớn. Các thắc mắc được trình bày trong hướng dẫn này có thể đóng vai trò là dụng cụ hữu ích trong hộp dụng cụ tuyển nhân sự tổng thể của các bạn để xác nhận và thuê các lập trình viên PHP thành thục từ ngữ này tốt hơn. Việc tìm kiếm những ứng viên như vậy rất đáng để nỗ lực vì họ chắc cú sẽ có thúc đẩy tích cực đáng kể tới năng suất và kết quả của nhóm bạn.


Xem thêm những thông tin liên quan đến đề tài Chuyên Viên php

Học lập trình PHP cùng Chuyên Viên giỏi tại Stanford

  • Tác giả: Anh Tuấn
  • Ngày đăng: 2018-03-18
  • Nhận xét: 4 ⭐ ( 8940 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: Khóa học lập trình PHP tại Stanford sẽ giúp bạn có đầy đủ tri thức và kĩ thuật thực hành được giảng dạy bởi Chuyên Viên giàu kinh nghiệm

Đội ngũ Chuyên Viên

  • Tác giả: aasc.com.vn
  • Nhận xét: 5 ⭐ ( 5853 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: Để Công ty tư vấn du học phát triển vững chắc, Người AASC luôn được tu tập về đạo đức nghề nghiệp, tập luyện về trình độ chuyên môn, rút gọn về kinh nghiệm th...

Ngân sách nhanh chóng

  • Tác giả: www.mypage.vn
  • Nhận xét: 5 ⭐ ( 7650 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: Thiết kế website PHP chuyên nghiệp, chuẩn seo, vận tốc load nhanh chóng, mang đến trải nghiệm tốt nhất cho người dùng. Bạn có nhu cầu thiết kế liên hệ với mypage.vn...

Học lập trình PHP cùng Chuyên Viên giàu kinh nghiệm

  • Tác giả: vnseosem.com
  • Nhận xét: 5 ⭐ ( 1287 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: PHP đang là từ ngữ chiếm thị phần cao nhất trong các mảng lập trình website. Học lập trình PHP tại Stanford bạn sẽ có đầy đủ tri thức để tự tạo ra một...

10 Lời khuyên từ các Chuyên Viên PHP dành riêng cho người mới khởi đầu

  • Tác giả: www.codehub.com.vn
  • Nhận xét: 3 ⭐ ( 7015 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: PHP là từ ngữ đằng sau một số ứng dụng website mạnh nhất và thông dụng nhất hiện tại, bao gồm cả Fb và WordPress.
    Việc học một từ ngữ lập trình mới có thể khó ƙ...

Lập trình website mã nguồn mở với php và mysql

  • Tác giả: devmaster.edu.vn
  • Nhận xét: 4 ⭐ ( 7283 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: Lập trình website mã nguồn mở với php và mysql, Huấn luyện lập trình viên chuyên nghiệp - php - .net - java - android - ios - ¢ - ₵++,₵#, Tư vấn thiết kế và xậy dựng PM, thiết kế website

NutiFood Việt Nam

  • Tác giả: nutifood.com.vn
  • Nhận xét: 5 ⭐ ( 6782 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: Với định hướng phát triển “Chuyên Gia Dinh Dưỡng”, Công ty tư vấn du học sữa NutiFood luôn đầu tư mạnh mẽ vào phân tích phát triển sản phẩm dinh dưỡng chuyên biệt.

Xem thêm các nội dung khác thuộc thể loại: Thủ thuật máy tính

Xem Thêm  Top 10 kết quả tìm kiếm anh gif hai huoc mới nhất 2022

By ads_php