Các biến toàn cục của WordPress không hoạt động

Tôi cố gắng sử dụng mã này và đối với các câu lệnh if, tôi phải đặt một $query obj toàn cầu trước mã, tôi không biết liệu có đúng như vậy không

global $query_obj;
if ( is_a($query_obj, 'WP_Term') ) {
    $my_base_url = get_term_link($query_obj);
} elseif ( is_a($query_obj, 'WP_Post') ) {
    $my_base_url = get_permalink();
} else {
    $my_base_url = null;
}

điều này dường như được làm việc đúng theo cách này. Trong wordpress của tôi chỉ trả về null. nhưng biến toàn cục $my_base_url vẫn hoạt động tốt khi gọi $global $query_obj trước câu lệnh if

global $query_obj;
if ( is_a($query_obj, 'WP_Term') ) {
    $my_base_url = get_term_link($query_obj);
} elseif ( is_a($query_obj, 'WP_Post') ) {
    $my_base_url = get_permalink();
} else {
    $my_base_url = 'its null';
}
function ti(){
  global $my_base_url;
  echo '
';
  print_r($my_base_url);
  echo '
';

Bây giờ để kiểm tra chức năng, tôi sẽ cần ít nhất các biến $args , $items

Nếu bạn đã đặt gỡ lỗi wp thành true trong cấu hình wp. php lỗi này sẽ xuất hiện

define( 'WP_DEBUG', true );

trình bày bởi. Wordpress/Stackoverflow

Một trong những tính năng xấu nhất của WordPress là việc sử dụng “các biến toàn cục PHP. ” Cho dù bạn yêu hay ghét chúng, mặc dù vậy, các biến toàn cầu có thể sẽ không sớm rời bỏ WordPress

Vì vậy, hôm nay chúng tôi sẽ đề cập đến tất cả những điều cần biết về toàn cầu PHP của WordPress. cách nghĩ về chúng;

Phạm vi biến có nghĩa là gì trong PHP

Điều này có nghĩa là bất kỳ đơn vị PHP cụ thể nào cũng sẽ có quyền truy cập vào các biến trong phạm vi toàn cầu hoặc chỉ có quyền truy cập vào các biến được khai báo bên trong hàm hiện đang thực thi

Scope là thương hiệu nước súc miệng nổi tiếng của Mỹ. Nhưng nó cũng, và quan trọng hơn, về những gì có liên quan và hiển thị cho ai và ở đâu. Mọi người sử dụng cụm từ "ngoài phạm vi" khi nói về các hoạt động hoặc ý tưởng hiện không liên quan đến những gì họ đang làm và điều đó liên quan nhiều đến phạm vi thay đổi

Các ngôn ngữ lập trình như PHP được viết sao cho các biến chỉ có thể truy cập được trong một ngữ cảnh hoặc phạm vi nhất định. Điều này được thực hiện theo nhiều cách khác nhau và dựa trên các quy tắc khác nhau trong các ngôn ngữ khác nhau. Nhưng mục đích của phạm vi biến là để ngăn chặn sự cố mà một phần của chương trình có thể đặt $i thành 5 và trong khi chờ sử dụng giá trị đó, thì phần khác lại đặt giá trị đó thành 981235792 hoặc “cucumber. ” Nếu cả hai đang sử dụng cùng một $i, thì một trong những phần đó của chương trình rất có khả năng bị trục trặc

Các biến được cung cấp phạm vi để ngăn các chương trình (và đầu của lập trình viên) phát nổ. Các quy tắc cụ thể kiểm soát những biến nào có thể truy cập được ở những vị trí khác nhau giữa ngôn ngữ lập trình với ngôn ngữ lập trình. Điều liên quan đến ai đó quan tâm đến WordPress và PHP là cách thức hoạt động cụ thể của nó trong bối cảnh đó

PHP là một ngôn ngữ sử dụng chức năng phạm vi. Điều này có nghĩa là bất kỳ đơn vị PHP cụ thể nào cũng sẽ có quyền truy cập vào các biến trong phạm vi toàn cầu hoặc chỉ có quyền truy cập vào các biến được khai báo bên trong hàm hiện đang thực thi. Và các biến được khai báo trong một hàm sẽ không khả dụng trên toàn cầu trừ khi chúng tuyên bố rõ ràng rằng chúng là. Tôi có thể tiếp tục nói một cách trừu tượng, nhưng tôi nghĩ tốt nhất là chúng ta nên cụ thể hóa với PHP. chúng ta sẽ khai báo các biến toàn cục bên trong các hàm và cũng truy cập vào phạm vi toàn cầu

Ví dụ về biến toàn cục PHP. Chơi với Phạm vi trong PHP

Trong phần này, tôi chỉ muốn giới thiệu cho bạn tất cả nội dung có phạm vi biến toàn cục này trông như thế nào trong một số PHP cơ bản. Khai báo một biến toàn cục, truy cập một biến toàn cục và hơn thế nữa có thể được giải thích bằng mã PHP mẫu không phải WordPress này

$global = "I am a global variable because I wasn't defined inside a function.";

function my_global_function() { 
     global $global; 
     echo $global;
}

function my_nonglobal_function($global) {
     echo $global;
}

my_global_function();
my_nonglobal_function($global);

function make_something_else_global() {
    global $second_global;
    $second_global = "I'm global becuase the word global was used inside a function.";
}
make_something_else_global();
echo $second_global;

Như chúng tôi đã nói trong phần trước, thực sự chỉ có hai phạm vi phù hợp trong PHP cho các biến bạn tạo. toàn cầu và chức năng. (Có loại phạm vi thứ ba, nhưng nếu bạn muốn biết thêm về các siêu toàn cầu như $_GET, $_POST$_REQUEST, nhưng chúng là một chủ đề quá lớn để giải quyết ở đây. )

khai báo. Trong PHP, tạo một biến toàn cục

Nếu bạn muốn khai báo một biến toàn cục trong PHP, bạn có thể làm điều đó bên ngoài một hàm. Đó là bởi vì bất kỳ biến PHP nào không nằm trong hàm (và do đó không nằm trong phạm vi hàm) đều là biến toàn cục. Giá trị của biến $global dù sao cũng sẽ hoạt động sau dòng mã khai báo nó. Và bởi vì chúng tôi đang khai báo $global bên ngoài một chức năng, nó sẽ tự động có trạng thái toàn cầu

Nhưng trong rất nhiều PHP dành cho WordPress, bạn sẽ ở bên trong một hàm. Điều này thường là do bạn đang làm việc với một hook WordPress. Để cung cấp một biến ở mọi nơi (toàn cầu) từ bên trong một hàm nghĩa là trước tiên bạn phải khai báo biến đó là global. Sau đó, bạn có thể gán biến đó cho bất cứ thứ gì bạn thích. Đó là những gì chúng tôi đang làm bên trong hàm

global $post;
0 trong phần mã ở trên

Đó là cách đặt biến toàn cục trong PHP. trước tiên hãy đảm bảo rằng bạn sẽ có một biến là toàn cầu, theo vị trí (bên ngoài bất kỳ chức năng nào) hoặc bằng cách sử dụng từ khóa global. Sau đó, bạn chỉ cần đặt nó hoặc đặt lại. Thậm chí 100 lần. PHP không quan tâm

Biến toàn cục truy cập PHP, “nhập” với từ khóa global

Bên trong một hàm PHP, một biến toàn cục (được khai báo ở nơi khác) có thể được truy cập theo hai cách. Đầu tiên (và phổ biến nhất), là truy cập nó bằng từ khóa global. Đây là chức năng được gọi đầu tiên của chúng ta,

global $post;
4, thực hiện. Bằng cách khẳng định rằng nó muốn biến toàn cục $global, echo — vốn chỉ là từ vựng PHP cho “ném lên màn hình” — có thể xuất ra chuỗi mà chúng ta đã khai báo trong dòng đầu tiên của ví dụ. Nếu chúng tôi bỏ qua dòng global, chúng tôi - tùy thuộc vào cài đặt - sẽ thấy lỗi PHP hoặc không có gì trên màn hình. Không phải là những gì chúng tôi muốn

Đoạn mã này chỉ ra một cách khác mà chúng ta có thể sử dụng biến được khai báo trước $global trong

global $post;
8. Để làm điều đó, chúng ta có thể chuyển $global nó vào hàm dưới dạng tham số. Điều này cho phép chúng tôi chắc chắn hơn một chút về biến mà chúng tôi thực sự nhận được trong hàm, bởi vì đó là một sự chuyển giao. và nó cho phép chúng ta chuyển thẳng đến $i0 mà không cần dừng lại để “nhập” biến. Đây là một cách để tránh sử dụng nhiều PHP toàn cầu

Như bạn có thể thấy, hai chức năng này đều thực hiện cùng một việc. Bạn sẽ thấy cả hai phương thức xảy ra ở những nơi khác nhau trong các dự án PHP khác nhau. Việc sử dụng global đã không còn được ưa chuộng trong cộng đồng PHP vì rủi ro là trước khi chức năng của chúng tôi truy cập vào $global, nó có thể dễ dàng bị thay đổi thành bất kỳ thứ gì và chúng tôi sẽ đưa ra giả định sai về nó và hoàn toàn có thể gây ra . Phương pháp chuyển các biến có liên quan vào hàm khi nó được gọi được ưu tiên trong các dự án không lo lắng về khả năng tương thích ngược nhiều như WordPress

Mảng toàn cầu PHP. Giống như một biến

Một lưu ý cuối cùng. bạn có thể gán hầu hết mọi thứ cho một biến (toàn cục) trong PHP. Cho dù là một chuỗi, đối tượng hay mảng, tất cả những gì bạn cần làm để tạo một mảng toàn cục trong PHP là làm theo bước chúng tôi phác thảo ở trên. chủ yếu. khai báo $i3 đó thực sự là tất cả để tạo một mảng toàn cầu PHP

Và trong khi bạn có thể nghĩ, “Tôi đang làm global tốt hơn” bởi vì bạn chỉ có “một” mảng toàn cầu, tôi sẽ cảnh báo bạn rằng từ góc độ nguyên tắc phòng ngừa, bất kỳ thứ gì thay đổi độc lập đều nên được coi là biến toàn cục tự do. Mỗi phần tử của mảng đó là một biến toàn cục. Ngay cả khi bạn đã nhét tất cả chúng vào một mảng được dán nhãn, chẳng hạn, $i5

Bài đăng toàn cầu của WordPress ($i6). Phạm vi biến trong WordPress

Như tôi đã nói ở trên, WordPress phụ thuộc rất nhiều vào biến toàn cục PHP. (Đây là danh sách tất cả các toàn cầu của nó. ) Do đó, điều đặc biệt phổ biến là bạn sẽ thấy một hàm bắt đầu bằng một dòng như

global $post;

Hy vọng rằng bây giờ bạn đã có một ý tưởng khá tốt về những gì nó đang làm. nhập toàn bộ biến $i6 toàn cục — dựa vào đó thẻ mẫu có chức năng như $i8 (hoặc biến bạn tự tạo) — vào phạm vi cục bộ để nó có thể hành động trên đó. Điều này phổ biến đến mức bạn sẽ thấy mọi người quên mất sự cần thiết phải khai báo global hoặc thêm dòng ở đầu chức năng của họ khi điều đó không thực sự cần thiết. (Thường là không cần thiết vì lập trình viên không bao giờ truy cập trực tiếp bất kỳ thứ gì trên $i6 sau khi họ “nhập” nó từ phạm vi toàn cầu. )

Một ví dụ điển hình khác, ngoài vòng lặp bên trong với các thẻ mẫu như $i1 và $i2 về nơi phạm vi toàn cầu được sử dụng trong WordPress là chính Vòng lặp thần thoại. Nếu bạn đã viết một $i3 tùy chỉnh, bạn có thể nghi ngờ điều đó, nhưng cách bạn có thể sử dụng các phương thức không có đối tượng như $i4 và $i5 bên trong các tệp phân cấp mẫu của bạn là dưới vỏ bọc, bạn đang gọi các phương thức tương tự đó trên toàn cầu . (Tôi muốn nói với những người mới bắt đầu rằng hãy nghĩ về điều này như một “chiếc túi kỳ diệu chứa các bài đăng”, nhưng các chuyên gia ngầm hiểu rằng đó chỉ là một đối tượng $i3. )

Bạn có nên sử dụng biến toàn cầu trong PHP?

Có nhiều cuộc thảo luận kéo dài hàng thập kỷ trong giới phát triển phần mềm về lý do tại sao việc phụ thuộc nhiều vào các biến có phạm vi toàn cầu là một quyết định thiết kế tồi. Cuộc tranh luận đó nằm ngoài phạm vi những gì tôi muốn trình bày ở đây. (Nếu chủ đề đó thú vị với bạn, thì bài viết C2 Wiki về chủ đề đó là một điểm khởi đầu tốt để hiểu các lập luận. ) Đủ để nói rằng chúng xấu vì chúng có thể gây ra “hành động ma quái từ xa. ” Hay nói cách khác, vì các biến toàn cục là “toàn cục”, nên việc người khác thay đổi thành biến toàn cục có thể phá vỡ mã của bạn. Và họ chỉ có thể làm điều đó bởi vì đó là một “cơ quan toàn cầu. ”

Điểm chính có lợi cho các biến toàn cầu? . Như chúng ta sẽ thấy, chỉ cần thả từ khóa global vào PHP của bạn và bạn đã bắt đầu cuộc đua

Chúng ta đã học được gì về các biến toàn cục PHP

Nơi bạn có thể tránh nó, nó thường được coi là một ý tưởng tốt hơn nếu không thêm mọi thứ vào phạm vi toàn cầu PHP. Đưa ra lựa chọn giữa việc chuyển một biến sang hàm mới bằng cách sử dụng biến đó làm tham số hoặc thêm biến của bạn vào phạm vi toàn cầu, cách tốt nhất là thực hiện điều trước. Nhưng vì WordPress quá bảo thủ nên các biến toàn cầu sẽ không sớm rời bỏ chúng ta. Vì lý do đó, bạn đã kiếm được một sức mạnh quý giá bằng cách hiểu họ. hack vui vẻ

Có gì sai với các biến toàn cầu?

Vấn đề chính khi sử dụng các biến toàn cục là chúng tạo ra các liên kết ngầm giữa các phần khác nhau của chương trình (các quy trình khác nhau có thể thiết lập hoặc sửa đổi một .

Tại sao biến toàn cầu của tôi không được xác định?

Lý do cảnh báo đầu tiên không được xác định là vì bạn đã khai báo lại biến toàn cục dưới dạng biến cục bộ bên dưới nó trong hàm . Và trong javascript, điều đó có nghĩa là từ đầu hàm, nó được coi là biến cục bộ.

Làm cách nào để khai báo biến toàn cục trong PHP WordPress?

cú pháp đúng sẽ là. biến $ toàn cục; . .

Việc sử dụng các biến toàn cục trong JavaScript có phải là cách làm không tốt không?

Tránh toàn cục. Các biến toàn cục và tên hàm là một ý tưởng cực kỳ tồi . Lý do là mọi tệp JavaScript có trong trang đều chạy trong cùng một phạm vi.