Chức năng gọi lại PHP với việc sử dụng

Các hàm gọi lại được gọi bởi PHP bất cứ khi nào một sự kiện nào đó xảy ra. Ví dụ: khi phân tích cú pháp XML, PHP có thể gọi một hàm mỗi khi nó chạm vào thẻ và bạn có thể xác định hàm người dùng của riêng mình cho mục đích được PHP gọi, sau đó chuyển tên của hàm cho PHP. Các hàm gọi lại luôn có các yêu cầu nghiêm ngặt về số lượng tham số mà chúng có thể nhận, vì PHP thường muốn chuyển các biến cho hàm gọi lại của bạn để bạn sử dụng

Chúng ta sẽ đề cập đến các trường hợp riêng lẻ của hàm gọi lại theo yêu cầu xuyên suốt cuốn sách này - hiện tại, điều cần thiết đơn giản là bạn hiểu chúng là gì

Bạn muốn học PHP 7?

Hacking with PHP đã được cập nhật đầy đủ cho PHP 7 và hiện có sẵn dưới dạng PDF có thể tải xuống. Nhận hơn 1200 trang học PHP thực hành ngay hôm nay

Nếu điều này hữu ích, vui lòng dành chút thời gian để nói với những người khác về Hacking với PHP bằng cách tweet về nó

Đã đến lúc cho các chức năng gọi lại. Chức năng gọi lại là gì? . Tôi nghĩ rằng đã đến lúc xem xét khái niệm này một cách chi tiết để đặt nó sau lưng chúng ta một lần và mãi mãi. Chúng ta sẽ đề cập đến việc chuyển các hàm ẩn danh [các bao đóng] và các hàm mũi tên làm đối số cho các hàm khác, sau đó gọi chúng.

Các hàm gọi lại rất có ý nghĩa trong các ngôn ngữ không đồng bộ vì chúng ta có thể không muốn hai hàm cạnh tranh về thời gian hoàn thành. Một chức năng có thể phụ thuộc vào kết quả của một chức năng khác, vì vậy chúng ta sẽ cần hai chức năng thực thi đồng bộ [lần lượt từng chức năng]

Chúng ta đã quen với việc truyền số nguyên, chuỗi và thậm chí cả mảng làm đối số vào hàm, nhưng chúng ta có thể không quen với việc truyền chính hàm làm đối số vào các hàm khác

Nếu bạn không quen với khái niệm về cách hoạt động của các hàm, tôi khuyên bạn nên đọc các bài viết khác của tôi về các khái niệm này. Dưới đây là một vài điều mà bạn có thể muốn tự làm quen trước khi tiếp tục

PHP 7. x — P35. Hàm do người dùng xác định
PHP 7. x — P36. Đối số hàm
PHP 7. x — P37. Hàm trả về giá trị
PHP 7. x — P38. Hàm biến
PHP 7. x — P39. Hàm ẩn danh
PHP 7. x — P40. sử dụng Từ khóa
PHP 7. x — P41. Hàm mũi tên

Tôi sẽ tóm tắt ngắn gọn một vài khái niệm để bức tranh tổng thể có ý nghĩa hơn. Chúng ta sẽ tạo một hàm add_one_to_x[] chấp nhận một đối số. Sau đó, hàm sẽ thêm 1 vào đối số và lặp lại kết quả

Khá chuẩn cho đến nay. Chúng tôi đã chuyển một số nguyên làm đối số. Cách mà bạn có thể nghĩ về nó là giá trị 5 được gán cho biến [tham số] $x. Chỉ cần tưởng tượng rằng chúng ta đã chuyển $x vào thân hàm. Kết quả sẽ giống nhau

Tất nhiên, điều này không mang lại cho chúng ta sự linh hoạt để truyền đối số cho hàm vì nó được mã hóa cứng bên trong thân hàm, nhưng điều quan trọng là phải có hình ảnh trực quan này. Chúng ta cũng có thể hình dung điều này bằng cách gán giá trị mặc định cho tham số

Toàn bộ mục đích của những ví dụ cơ bản này là để có một hình ảnh trực quan về chuyển động của đối số từ lời gọi hàm đến định nghĩa hàm. Hãy xem điều gì sẽ xảy ra khi chúng ta chuyển đối số cho hàm add_one_to_x[]

Tôi chắc chắn rằng bạn đã biết điều này. Tôi nghĩ rằng chúng tôi đã dành đủ thời gian cho khái niệm này vì vậy hãy chuyển sang khái niệm tiếp theo

Bạn có biết rằng có một cách khác để gọi các hàm trong PHP không?

Bạn có thể đã gọi các chức năng như tôi đã làm ở dòng 7 ở trên. Tuy nhiên, PHP có một hàm dựng sẵn, call_user_func[], chấp nhận một chuỗi làm đối số. Chuỗi đó là tên của hàm mà bạn muốn gọi. Câu lệnh call_user_func[“say_hello”] ở dòng 8 thực hiện chính xác như câu lệnh say_hello[] ở dòng 7. Không có mánh khóe nào ở đây. nó thực sự chỉ là một cách khác để gọi một chức năng

Hãy tạo một hàm gọi là animal_says[]. Ban đầu, chức năng đó sẽ chấp nhận hai đối số. Những đối số đó sẽ chỉ được lặp lại sau khi hàm được gọi

Trong ví dụ trên, hai đối số được truyền cho hàm animal_says[]. Chức năng đó sau đó sẽ lặp lại Cat said Dogs suck. Tôi đã tạo hai câu lệnh echo vì chúng ta sẽ sửa đổi chức năng này tiếp theo

Hãy thay đổi câu lệnh echo thứ hai. Thay vì lặp lại trực tiếp đối số $animal_saying, chúng ta sẽ gọi một hàm khác sẽ làm điều đó cho chúng ta

Chúng tôi bắt đầu bằng cách tạo một chức năng mới, cat_says[]. Hàm đó chấp nhận một đối số và nó lặp lại giá trị khi nó được gọi. Hàm cat_says[] được gọi từ bên trong hàm animal_says[]. Đó là những thay đổi. Hãy xem qua ví dụ này và xem điều gì đang xảy ra. Chúng ta vẫn chưa nắm được khái niệm về hàm gọi lại, nhưng chúng ta đã thực sự gần

  1. PHP đến dòng 12. Hàm animal_says[] được gọi và hai đối số được truyền vào. dây Cat and Dogs hút
  2. PHP nhập hàm animal_says[] ở dòng 3. Đối số đầu tiên được nối với chuỗi " nói " và được lặp lại
  3. Đối số thứ hai, Dogs suck, được truyền dưới dạng đối số cho hàm cat_says[]
  4. PHP nhập hàm cat_says[]. Lập luận Chó hút được vang ra
  5. PHP thoát khỏi hàm cat_says[] và trở về hàm animal_says[]
  6. PHP thoát khỏi hàm animal_says[] và kết thúc thực thi chương trình sau dòng 12
  7. Tổng sản lượng là. Mèo nói Chó dở

Nếu tôi biết mèo, và tôi biết, họ sẽ luôn nói rằng Chó thật tệ. Vì vậy, điểm đầu tiên của việc chuyển đối số cho hàm cat_says[] là gì. Chúng ta chỉ có thể lặp lại nó ngay tại đó

Những con chó đã bị xúc phạm. Họ cũng muốn có chức năng riêng của họ. Hãy tạo một hàm dog_says[]. Họ muốn luôn nói rằng Mèo thật tệ

Hãy tưởng tượng rằng chúng ta không có quyền truy cập trực tiếp vào các hàm cat_says[] và dog_says[] mà chúng ta chỉ có quyền truy cập vào hàm animal_says[] [bạn sẽ thấy khái niệm này trong lập trình hướng đối tượng mà chúng ta sẽ đề cập sau

Nếu chúng ta gọi hàm animal_says[] và truyền cho nó đối số Cat, chúng ta sẽ nhận được kết quả sau. Mèo nói Chó dở. Nếu chúng ta gọi hàm animal_says[] và truyền cho nó đối số Dog, chúng ta sẽ nhận được đầu ra sau. Chó nói Chó hút. Tuy nhiên, đó không phải là điều chúng tôi muốn; . Hiện tại, hàm cat_says[] được mã hóa cứng trên dòng 5. Chúng ta có thể thực hiện câu lệnh if/else và gọi hàm cat_says[] nếu đối số Cat được truyền và gọi hàm dog_says[] nếu đối số Dog được truyền

Điều này thực sự hiệu quả, nhưng nếu chúng ta muốn thêm một chức năng cho mọi con vật thì sao? . Điều đó có nghĩa là chúng ta sẽ có một câu lệnh if/else khổng lồ

Hãy loại bỏ cơn đau đầu đó ngay bây giờ. Sẽ không hay sao nếu chỉ cần chuyển chức năng mà chúng ta muốn và để nó được gọi tự động mà không cần câu lệnh if/else?

Hàm animal_says[] của chúng ta sẽ cần chấp nhận đối số thứ hai. Đối số thứ hai đó sẽ là tên của hàm mà chúng ta muốn gọi. Sau đó, chúng tôi sẽ chuyển đối số chuỗi đó cho hàm call_user_func[] và yêu cầu PHP gọi hàm

Hãy xem qua ví dụ và đảm bảo rằng chúng tôi nhận được kết quả như mong muốn

  1. Hàm animal_says[] được gọi ở dòng 16 và được truyền hai đối số. chuỗi Cat và chuỗi cat_says
  2. PHP nhập hàm animal_says trên dòng 3. Nó đi vào phần thân của hàm và thực hiện câu lệnh echo trên dòng 4. con mèo nói
  3. Sau đó, nó di chuyển đến dòng tiếp theo [5] và chuyển đối số $animal_function cho hàm call_user_func[]. Chuỗi “cat_says” được chuyển đến hàm call_user_func[]. Bản thân hàm call_user_func[] gọi hàm cat_says[], hàm này lặp lại Dogs suck
  4. PHP thoát khỏi hàm cat_says[] và trở về hàm animal_says[]
  5. PHP thoát khỏi hàm animal_says[] và quay lại dòng 16. Câu lệnh ở dòng 16 kết thúc và PHP chuyển sang dòng 17
  6. PHP gọi hàm animal_says[] và truyền hai đối số cho nó. chuỗi Dog và chuỗi dog_says
  7. PHP nhập hàm animal_says trên dòng 3. Nó đi vào phần thân của hàm và thực hiện câu lệnh echo trên dòng 4. Con chó nói
  8. Sau đó, nó di chuyển đến dòng tiếp theo [5] và chuyển chuỗi dog_says tới hàm call_user_func[]. Bản thân hàm call_user_func[] gọi hàm dog_says[], từ đó lặp lại Cats suck
  9. PHP thoát khỏi hàm dog_says[] và quay lại hàm animal_says[]
  10. PHP thoát khỏi hàm animal_says[] và quay lại dòng 17. Câu lệnh ở dòng 17 kết thúc và PHP kết thúc chương trình

Đó gần như là chức năng gọi lại. Tên hàm, là một chuỗi, được truyền dưới dạng đối số và được thực thi bên trong hàm animal_says[]. Và thành thật mà nói, bạn có thể dừng ở đây và thực hiện các chức năng theo cách này. Điều duy nhất bạn cần biết là cách truyền đối số cho các hàm được gọi bằng hàm call_user_func[]. Hãy đảm bảo rằng chúng ta có tất cả các cơ sở của mình và cũng thảo luận về khái niệm đó

Chó và mèo của chúng tôi ngồi xuống và tìm ra một số khác biệt. Hóa ra họ muốn có thể nói những điều khác nhau chứ không chỉ Chó dở hay Mèo dở. Các hàm cat_says[] và dog_says[] sẽ phải được sửa đổi để chúng có thể chấp nhận một đối số và lặp lại đối số đó. call_user_func[] có tham số tùy chọn thứ hai, cho phép người dùng truyền đối số cho hàm

call_user_func[ $function_name, $function_arg = "" ]

Viết ra call_user_func[“dog_says”, “Xin chào”] sẽ giống như gọi hàm dog_says[] như thế này. dog_says[“Xin chào”]. Hãy áp dụng những nguyên tắc đó vào thực tế

Hàm animal_says[] hiện chấp nhận ba đối số

  1. chuỗi $animal_type sẽ được lặp lại trên dòng 4
  2. chuỗi $animal_function sẽ được chuyển đến hàm call_user_func[] để nó có thể thực hiện lệnh gọi hàm
  3. chuỗi $saying cũng sẽ được chuyển đến hàm call_user_func[]. Lần này, nó sẽ được truyền dưới dạng đối số cho hàm mà hàm call_user_func[] được yêu cầu thực thi

Vì vậy, nhìn vào dòng 16, hàm animal_says[] được gọi và được truyền ba đối số. chuỗi Cat, cat_says, và tôi yêu chó. Cat được lặp lại trên dòng 4 và hai đối số khác được chuyển đến hàm call_user_func[] trên dòng 5. call_user_func[] thực thi hàm call cat_say[$saying] và chuyển đối số I love dogs cho nó. PHP thực thi câu lệnh echo trên dòng 9, Meow. Tôi yêu những chú chó. Quá trình này được lặp lại ở dòng 17 với các đối số mới kích hoạt hàm dog_says[] được gọi

Chúng ta không phải sử dụng hàm call_user_func[] cho lệnh gọi hàm của mình. Nhớ chức năng biến? . Tóm lại, bạn có thể lưu trữ tên của một hàm dưới dạng một chuỗi bên trong một biến và gọi hàm đó bằng cách thêm một vài dấu ngoặc đơn vào biến đó

Chúng ta có thể sử dụng khái niệm này để thay thế call_user_func[] của mình vì tên của hàm được lưu trữ bên trong tham số $animal_function của chúng ta. Chúng ta sẽ chỉ thay thế call_user_func[$animal_function, $saying] bằng $animal_function[$saying];

Tôi biết rằng tôi đang từng bước thực hiện các thay đổi và tôi đang thực hiện việc này một cách thận trọng. Tôi muốn đảm bảo rằng bạn hiểu từng tiến trình

Tiếp theo, thay đổi duy nhất mà chúng ta sẽ thực hiện là thay đổi tên tham số từ $animal_function thành $callback. Theo thông lệ, người ta gọi tham số này là $callback để làm rõ ràng rằng hàm sẽ được gọi bên trong hàm này

Chúng ta có ở đây không? . Cho đến giờ, chúng ta đã chuyển tên [chuỗi] của hàm mà chúng ta muốn gọi bên trong hàm animal_says[]. Nhưng hãy nhớ rằng, hàm gọi lại là một hàm được truyền dưới dạng đối số, không phải là một chuỗi được truyền dưới dạng đối số

Hãy thay đổi các hàm cat_says[] và dog_says[] thành các hàm ẩn danh. Chúng ta sẽ gán chúng cho các biến $cat_says và $dog_says. Khi chúng ta thay đổi những giá trị đó, thì chúng ta có thể chuyển biến $cat_says và biến $dog_says làm đối số, thay vì các chuỗi cat_says và dog_says. Trước khi chúng tôi làm điều đó, hãy tóm tắt ngắn gọn các chức năng ẩn danh và cách gọi chúng

Trong ví dụ trên, chúng tôi tạo một biến $cat_says và gán chức năng ẩn danh [đóng] cho nó. Việc đóng cửa đó có một tham số, $cat_saying và lặp lại Meow. theo sau là giá trị tham số [giá trị của $cat_saying]. Hàm đóng được gọi ở dòng 7 bằng cách thêm dấu ngoặc đơn vào hàm $cat_says[] và truyền đối số tôi yêu chó. Khi chức năng được thực thi, đầu ra sẽ là Meow. Tôi yêu những chú chó

Chúng tôi có một chức năng được giải quyết; . Chúng ta sẽ không cần sửa đổi bất cứ thứ gì bên trong vì hàm biến và hàm ẩn danh về mặt kỹ thuật có cùng cú pháp

Nhìn vào mã, chúng tôi đã thay đổi hàm cat_says[] thành một đóng trên dòng 8. Chúng tôi cũng đã thay đổi hàm dog_says[] thành một đóng trên dòng 12. Sau đó, chúng tôi sẽ chuyển bao đóng $cat_says và đóng $dog_says làm đối số trên dòng 16 và 17. Đây là điều mà các nhà phát triển dường như không thể hiểu được, vì vậy tôi sẽ rút ra. Hãy nhìn vào dòng 16 và chỉ tập trung vào đối số thứ hai. Nếu bạn cần xem lại cách truyền chuỗi dưới dạng đối số, bạn có thể xem hình minh họa đầu tiên ở đầu bài viết này

Vì $cat_says bằng với bao đóng, nên chúng ta chỉ có thể thay thế đối số thành bao đóng. Vì vậy, hãy giả sử rằng chúng ta đã đưa toàn bộ chức năng vào đối số

Như bạn có thể thấy, bao đóng được truyền dưới dạng đối số cho hàm animal_says[]. Việc đóng cửa được gán cho tham số $callback. Bây giờ chúng ta biết biến $callback nắm giữ cái gì; . Làm thế nào để chúng ta gọi một đóng cửa? . Bây giờ chúng ta hãy mở rộng vấn đề này và xem đối số thứ ba diễn ra như thế nào

  1. Đối số được truyền khi hàm animal_says[] được gọi
  2. Nó được gán làm giá trị tham số thứ ba
  3. Nó được chuyển đến lệnh gọi hàm $callback[]
  4. Nó được thông qua để đóng cửa
  5. Nó vang vọng từ bên trong phần đóng cửa

Điều gì sẽ ngăn chúng ta chuyển toàn bộ bao đóng dưới dạng đối số thay vì chuyển biến được gán cho bao đóng? . Chúng ta đang chuyển các chuỗi dưới dạng đối số, tại sao chúng ta không thể chuyển các hàm dưới dạng đối số? . Chúng tôi vừa vượt qua chuỗi

Hãy xem việc chuyển các hàm ẩn danh dưới dạng đối số. Lần này, chúng ta sẽ không tạo các bao đóng $dog_says và $cat_says. Chúng ta sẽ chuyển trực tiếp các bao đóng đó dưới dạng đối số

Chúng tôi vừa loại bỏ hai lần đóng và chuyển chúng trực tiếp dưới dạng đối số

  1. Online 8, một hàm gọi động vật nói[] được thực hiện
  2. Đối số đầu tiên là chuỗi Cat. Chuỗi đó được gán cho tham số $animal_type
  3. Đối số thứ hai là hàm. hàm[ $cat_saying ] { … };. Chức năng đó được gán cho tham số $callback
  4. Đối số thứ ba là chuỗi tôi yêu chó. Chuỗi đó được gán cho tham số $saying
  5. Vào bên trong hàm animal_says[], đối số đầu tiên được lặp lại ở dòng 4
  6. Ở dòng 5, chúng ta chỉ gọi hàm đóng được gán cho tham số $callback bằng cách thêm một vài dấu ngoặc đơn vào nó và chuyển giá trị tham số $saying cho nó

Miễn là bạn có thể quan sát xung quanh nó một cách trực quan và xem cách bao đóng di chuyển xung quanh mã, các chức năng gọi lại sẽ rất dễ dàng. Tôi đã đặt hàm ẩn danh trên cùng một dòng với hai đối số còn lại, nhưng để dễ đọc, đối số đóng thường được đặt cách nhau trên nhiều dòng. Đây chỉ là sở thích

Chúng ta cũng có thể chuyển các hàm mũi tên thay vì các hàm ẩn danh để đơn giản hơn nữa. Hãy nhớ rằng các hàm mũi tên chỉ có thể trả về một đối số. Chúng tôi sẽ sửa đổi mã lần cuối

Nhìn vào dòng 8, hàm mũi tên được truyền dưới dạng đối số thứ hai. Hàm mũi tên sẽ chấp nhận một đối số khi nó được gọi ở dòng 5. Lập luận đó là tôi yêu chó. Nó sẽ trả lại Meow. Tôi yêu những chú chó. Toàn bộ chuỗi sẽ được lặp lại trên dòng 5

Và đó là nó. Tôi nghĩ rằng chúng tôi đã đề cập đến mọi thứ cần biết về chức năng gọi lại. Tôi thực sự hy vọng rằng điều này có ý nghĩa ngay bây giờ và bạn có thể đặt nỗi sợ hãi về các chức năng gọi lại sau lưng bạn một lần và mãi mãi

dinocajic/php-7-youtube-tutorials

Mã cho PHP 7. x hướng dẫn trên YouTube

github. com

Dino Cajic hiện là Trưởng phòng CNTT tại LSBio [LifeSpan BioSciences, Inc. ], Kháng thể tuyệt đối, Kerafast, Everest BioTech, Nordic MUbio và Exalpha. Ông cũng là Giám đốc điều hành tại MyAutoSystem. Ông có hơn một thập kỷ kinh nghiệm về công nghệ phần mềm. Anh ấy có điểm B. S. về Khoa học Máy tính và môn phụ về Sinh học. Nền tảng của anh ấy bao gồm việc tạo ra các ứng dụng thương mại điện tử cấp doanh nghiệp, thực hiện phát triển phần mềm dựa trên nghiên cứu và tạo điều kiện phổ biến kiến ​​thức thông qua viết lách

Bạn có thể kết nối với anh ấy trên LinkedIn, theo dõi anh ấy trên Instagram hoặc đăng ký ấn phẩm Phương tiện của anh ấy

Đọc mọi câu chuyện từ Dino Cajic [và hàng nghìn nhà văn khác trên Medium]. Phí thành viên của bạn trực tiếp hỗ trợ Dino Cajic và các nhà văn khác mà bạn đọc. Bạn cũng sẽ có toàn quyền truy cập vào mọi câu chuyện trên Phương tiện

Làm cách nào để chuyển hàm gọi lại trong php?

Gọi lại đơn giản . Ví dụ.

Chủ Đề