Khả năng hiển thị mặc định của các phương thức lớp trong PHP


118

Tôi đã xem hướng dẫn sử dụng , nhưng dường như tôi không thể tìm ra câu trả lời.

Khả năng hiển thị mặc định trong PHP đối với các phương thức không có khai báo khả năng hiển thị là gì? PHP có khả năng hiển thị gói như trong Java không?

Ví dụ, trong đoạn mã sau, là go()công khai hay riêng tư?

class test {
  function go() {
  }
}

Lý do tôi hỏi là tôi đã thấy nhiều mã cấu trúc được viết dưới dạng function __construct()và một số dưới dạng public function __construct(). Chúng có tương đương nhau không?

Câu trả lời:



22

Mặc định là công khai. Một phương pháp hay là luôn bao gồm nó, tuy nhiên các lớp được hỗ trợ PHP4 mà không có công cụ sửa đổi quyền truy cập, vì vậy, thông thường sẽ không thấy việc sử dụng chúng trong mã kế thừa.

Và không, PHP không có khả năng hiển thị gói, chủ yếu là vì cho đến gần đây PHP không có gói nào.


16
@Ian: Tôi sẽ nói bởi vì "rõ ràng tốt hơn là ngầm hiểu" (như Zen of python đã nói). Nó làm cho các lập trình viên khác lãng phí các chu kỳ của não để tự hỏi liệu hàm tạo là riêng tư hay công cộng hoặc cái gì. Nếu mọi người luôn sử dụng công cụ sửa đổi quyền truy cập, người đăng ban đầu thậm chí có thể không hỏi câu hỏi này.
Người dùng

Cũng cần lưu ý, trên các ngôn ngữ như Java, mặc định là gói riêng tư, người ta luôn tự hỏi liệu gói riêng tư theo thiết kế hay nhà phát triển đã quên chỉ định nó (đặc biệt khi giao dịch với các nhà phát triển không chuyên sâu). Đó là lý do tại sao PMD bao gồm các quy tắc như sau: pmd.github.io/pmd-5.5.2/pmd-java/rules/java/…
Johnco

9

Mặc định là công khai. Lý do có lẽ là khả năng tương thích ngược vì mã cũ mong đợi nó được công khai (nó sẽ ngừng hoạt động nếu nó không được công khai).


Kudos cho lý do.
Guney Ozsan


1

Khi không có tầm nhìn từ khóa ( public, privatehoặc protected) được sử dụng, phương pháp này sẽ được công . Tuy nhiên, bạn không thể xác định thuộc tính theo cách này. Đối với các thuộc tính , bạn sẽ cần phải thêm một từ khóa khả năng hiển thị trên khai báo.

Đối với các thuộc tính không được khai báo trong lớp và bạn gán giá trị cho nó bên trong một phương thức sẽ có chế độ hiển thị công khai.

<?php
class Example {
    public $name; 
    public function __construct() {
        $this -> age = 9; // age is now public
        $this -> privateFunction();
    }
    private function privateFunction() {
        $this -> country = "USA"; // this is also public
    }
}

0

function __construct()public function __construct()hoạt động như cùng một tên phương thức.

Nếu bạn không thể xác định tiền tố cho tên phương thức, nó phải là tiền tố theo mặc định.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.