Một biến riêng tư trong php là gì?

Vấn đề với các biến công khai là chúng cho phép các hàm được gọi và các biến được đặt từ bất kỳ đâu trong tập lệnh của bạn, đây thường không phải là một điều thông minh. Nghĩ lại trước đây - chúng ta có một đối tượng thẻ chó $DogTag bên trong mỗi đối tượng chó cũng như một biến $Name, nhưng chúng có thông tin lặp lại bên trong

Nếu chúng tôi đã thay đổi biến $Name, thì $DogTag có được cập nhật tự động không?

$poppy = new poodle; $poppy->Name = "Poppy"; $poppy->DogTag = new dogtag; $poppy->DogTag->Words = "My name is
Poppy. If you find me, please call 555-1234"; $poppy->Name = "Penny";
print $poppy->DogTag->Words;

Nếu bạn thử điều đó, bạn sẽ thấy vấn đề. Điều này đã phát sinh bởi vì chúng tôi đã cho phép bất kỳ phần nào trong tập lệnh của chúng tôi truy cập trực tiếp vào phần bên trong của đối tượng con chó của chúng tôi. Đây là một giải pháp

class dog {
    public $Name;
    public $DogTag;

    public function setName($NewName) {
        $Name = $NewName;
        $DogTag->Words = "My name is $NewName. If you find me, please call 555-1234";
    }
    

Lần này, đối tượng con chó đã nhúng logic để biết cách xử lý việc đổi tên đúng cách. Miễn là mọi người sử dụng hàm setName(), tên của con chó và thẻ con chó của nó sẽ được cập nhật chỉ với một lần gọi

Tuy nhiên, với kịch bản trên, một số lập trình viên vô đạo đức, lười biếng hoặc thiếu hiểu biết vẫn có thể viết $poppy->Name = "Rover", do đó không sử dụng hàm setName() đặc biệt mà chúng tôi đã cung cấp. Đây là lúc các biến riêng xuất hiện - chúng ta có thể hướng dẫn PHP rằng biến $Name là riêng tư và do đó chỉ có thể thay đổi với lớp mà nó là một phần của nó. Đây là mã mới

class dog {
    private $Name;
    private $DogTag;

    public function setName($NewName) {
        

Lưu ý rằng cả $Name và $DogTag đều là riêng tư, có nghĩa là không ai có thể truy cập chúng trừ khi làm như vậy trong một hàm là một phần của đối tượng, chẳng hạn như setName(). Lưu ý rằng bản thân setName() vẫn ở chế độ công khai - chúng tôi muốn bất kỳ ai cũng có thể truy cập được

Bây giờ nếu lập trình viên lười biếng của chúng ta xuất hiện và cố gắng đặt $Name trực tiếp bằng cách sử dụng mã như $poppy->Name, họ sẽ không nhận được những gì họ mong đợi. Bạn thấy đấy, nếu họ cố gắng thay đổi trực tiếp một biến riêng thì PHP sẽ tự động đưa ra thông báo lỗi. Tuy nhiên, nếu biến riêng đó được kế thừa từ một lớp khác, PHP sẽ cố gắng đáp ứng yêu cầu của họ bằng cách có một biến riêng và một biến chung. Vâng, điều này hơi khó hiểu, tuy nhiên đoạn mã sau sẽ làm sáng tỏ mọi thứ

Name = "Poppy";
    print_r($poppy);
?>

Chạy tập lệnh đó sẽ xuất ra như sau

poodle Object
(
[Name:private] =>
[Name] => Poppy
)

Lưu ý rằng có hai biến Tên - một biến là riêng tư và không thể chạm vào, và một biến khác mà PHP tạo để sử dụng cục bộ theo yêu cầu. Rõ ràng điều này gây nhầm lẫn và bạn nên cố gắng tránh tình huống này nếu có thể

Lưu ý rằng các hàm và biến riêng chỉ có thể được truy cập bởi lớp chính xác sở hữu chúng - các lớp con không thể truy cập các biến của hàm cha riêng. Để làm điều này, bạn cần có từ khóa protected

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ó

Để đặt quyền truy cập cho các phương thức và biến của lớp, chúng tôi sử dụng các công cụ sửa đổi quyền truy cập không gì khác ngoài các từ khóa PHP. Chúng ta thậm chí có thể gán một số công cụ sửa đổi truy cập này cho chính lớp đó để làm cho lớp hoạt động theo một cách đặc biệt

Sau đây là các từ khóa PHP được sử dụng làm công cụ sửa đổi truy cập cùng với ý nghĩa của chúng

  1. public. Khi chúng ta định nghĩa các thành viên của lớp là công khai, thì chúng có thể truy cập được từ mọi nơi, thậm chí từ bên ngoài phạm vi lớp
  2. private. Khi chúng ta định nghĩa các thành viên của lớp là riêng tư, chúng chỉ có thể được truy cập từ bên trong chính lớp đó
  3. protected. Điều này cũng giống như private, với một ngoại lệ, các thành viên của lớp được định nghĩa là protected vẫn có thể được truy cập từ lớp con của nó (Chúng ta sẽ tìm hiểu về các lớp con khi chúng ta học về Kế thừa)
  4. 0. Từ khóa này chỉ được sử dụng cho các lớp PHP và các hàm thành viên của nó
  5. 1. Các phương thức lớp được định nghĩa là cuối cùng, không thể thay đổi hoặc ghi đè bởi bất kỳ lớp con nào

Khi nào nên sử dụng công cụ sửa đổi truy cập nào

Chúng tôi không thể sử dụng tất cả các công cụ sửa đổi truy cập có sẵn với lớp, các biến và phương thức của nó. Trong bảng bên dưới, chúng tôi đã chỉ định trình xác định quyền truy cập nào được áp dụng cho những gì

Access ModiferclassesfunctionsvariablespublicNot ApplicableApplicableApplicableprivateNot ApplicableApplicableApplicableprotectedNot ApplicableApplicableApplicableabstractApplicableApplicableNot ApplicablefinalApplicableApplicableNot Applicable

Bây giờ chúng ta đã biết công cụ sửa đổi truy cập nào được sử dụng ở đâu, hãy tìm hiểu chi tiết về công cụ sửa đổi truy cập cùng với các ví dụ


public Công cụ sửa đổi truy cập

Nếu chúng tôi không chỉ định bất kỳ công cụ sửa đổi truy cập nào, tất cả các lớp và các thành viên của nó được coi là public theo mặc định

Như đã đề cập trong bảng trên, không thể sử dụng các từ bổ nghĩa truy cập public, private hoặc protected với lớp. Hãy xem điều gì xảy ra nếu chúng ta làm,

lỗi phân tích cú pháp. lỗi cú pháp, 'công khai' (T_PUBLIC) không mong muốn trong

Chúng tôi sẽ nhận được lỗi trên

Nhưng đối với các phương thức và biến của lớp, chúng ta nên chỉ định các chỉ định truy cập mặc dù theo mặc định, chúng được coi là công khai

Đây là một ví dụ đơn giản về lớp PHP

Trong đoạn mã trên, chúng tôi đã sử dụng từ khóa

7 trước biến lớp. Nếu chúng tôi không sử dụng 
7, chúng tôi sẽ gặp lỗi phân tích cú pháp

Nhưng thay vì sử dụng

7, chúng ta cũng có thể sử dụng các từ khóa công cụ sửa đổi truy cập trước lớp phân bổ biến lớp, chẳng hạn

Đây là cách chúng ta nên tạo một lớp PHP, cách lập trình tốt là chỉ định các công cụ sửa đổi truy cập cùng với các biến và phương thức của lớp


private Công cụ sửa đổi truy cập

Chúng ta có thể sử dụng công cụ sửa đổi truy cập private cho các biến và phương thức của lớp nhưng không phải cho lớp PHP. Khi một thành viên của lớp - một biến hoặc một hàm, được khai báo là private thì nó không thể được truy cập trực tiếp bằng đối tượng của lớp. Ví dụ

fname = $fname;
        }
        
        // public function to set value for lname
        public function setLName($lname) {
            $this->lname = $lname;
        }
        
        // public function to 
        public function showName() {
            echo "My name is: " . $this->fname . " " . $this->lname;
        }
    }
    
    // creating class object
    $john = new Person();
    
    // trying to access private class variables
    $john->fname = "John";  // invalid
    $john->lname = "Wick";  // invalid
    
    // calling the public function to set fname and lname
    $john->setFName("John");
    $john->setLName("Wick");

?>

Trong đoạn mã trên,

3 và 
4 là các biến lớp riêng, do đó chúng ta không thể truy cập trực tiếp chúng bằng đối tượng lớp

Vì vậy, khi chúng tôi cố gắng thực thi dòng mã sau

setFName("John");
?>

Chúng tôi sẽ nhận được một lỗi nghiêm trọng PHP

Lỗi nghiêm trọng. Không thể truy cập tài sản cá nhân Người. $fname trong

Nhưng chúng ta có thể dễ dàng truy cập các biến riêng của một lớp bằng cách định nghĩa các hàm công khai trong lớp. Chúng ta có thể tạo các hàm riêng biệt để đặt giá trị cho các biến riêng tư và để nhận cả giá trị của chúng. Các chức năng này được gọi là Getters và Setters

name = $name;
        }
        
        // public function to get value of name (getter method)
        public function getName() {
            return $this->name;
        }
    }
    
    // creating class object
    $john = new Person();
    
    // calling the public function to set fname
    $john->setName("John Wick");
    
    // getting the value of the name variable
    echo "My name is " . $john->getName();

?>

Tên tôi là John Wick

Chúng ta nên có các phương thức getter và setter cho tất cả các biến riêng tư trong lớp


protected Công cụ sửa đổi truy cập

Giống như công cụ sửa đổi truy cập _______ 35 _______, công cụ sửa đổi truy cập protected cũng hạn chế quyền truy cập của các biến lớp và phương thức bên ngoài lớp. Nhưng các biến và hàm của lớp protected có thể được truy cập bên trong lớp và bên trong lớp con (một lớp kế thừa lớp)

Chúng ta sẽ học cách tạo subclass và khái niệm về Inheritance trong các bài hướng dẫn sắp tới

Hãy lấy một ví dụ nhanh và đơn giản

getFeatures($this->gender);
        }
    }
    
    // object of Human class
    $human = new Human();
    // object of Male class
    $male = new Male();
    
    /*  
        accessing protected variables and methods
    */
    echo $human->genders;   // INVALID
    $human->getFeatures("Male");    // INVALID
    echo $male->gender;     // INVALID
    
    /*
        but we can call getMaleFeatures method,
        in which we are calling a protected method 
        of Human class
    */
    $male->getMaleFeatures();

?>

Trong chương trình trên, chúng tôi đã xác định hai lớp,

9 và 
fname = $fname;
        }
        
        // public function to set value for lname
        public function setLName($lname) {
            $this->lname = $lname;
        }
        
        // public function to 
        public function showName() {
            echo "My name is: " . $this->fname . " " . $this->lname;
        }
    }
    
    // creating class object
    $john = new Person();
    
    // trying to access private class variables
    $john->fname = "John";  // invalid
    $john->lname = "Wick";  // invalid
    
    // calling the public function to set fname and lname
    $john->setFName("John");
    $john->setLName("Wick");

?>
0. Lớp
fname = $fname;
        }
        
        // public function to set value for lname
        public function setLName($lname) {
            $this->lname = $lname;
        }
        
        // public function to 
        public function showName() {
            echo "My name is: " . $this->fname . " " . $this->lname;
        }
    }
    
    // creating class object
    $john = new Person();
    
    // trying to access private class variables
    $john->fname = "John";  // invalid
    $john->lname = "Wick";  // invalid
    
    // calling the public function to set fname and lname
    $john->setFName("John");
    $john->setLName("Wick");

?>
0 là lớp con của lớp
9

Trong lớp

9, tất cả các biến và phương thức của lớp là protected, do đó chúng không thể được truy cập từ bên ngoài lớp, nhưng chúng có thể được truy cập bên trong lớp con của lớp 
9

Đừng lo lắng nếu điều này có vẻ khó hiểu do khái niệm Kế thừa, chúng ta sẽ quay lại vấn đề này khi chúng ta tìm hiểu về Kế thừa


0 Công cụ sửa đổi truy cập

Công cụ sửa đổi truy cập

0 được sử dụng với lớp PHP và các chức năng của nó. Nó không thể được sử dụng cho các biến lớp

Nếu một lớp thậm chí chỉ có một phương thức

0. thì lớp cũng phải được định nghĩa là 
0

Ngoài ra, PHP không cho phép khởi tạo lớp trừu tượng i. e. bạn không thể tạo đối tượng của lớp

0, mặc dù các lớp này có thể được kế thừa

Chúng ta sẽ tìm hiểu chi tiết về công cụ sửa đổi truy cập này khi chúng ta sẽ đề cập đến Lớp trừu tượng và Giao diện


1 Công cụ sửa đổi truy cập

Khi chúng ta khai báo một lớp là

1, sử dụng công cụ sửa đổi truy cập này, thì lớp đó không thể được kế thừa

Tương tự, khi chúng ta định nghĩa một hàm lớp là

1, PHP hạn chế các lớp con của lớp đó ghi đè hàm được khai báo là 
1

Làm cách nào để sử dụng các biến riêng tư trong PHP?

Cách tốt nhất để khai báo một biến riêng trong Lớp PHP là tạo chúng phía trên phương thức __Construction , theo quy ước, bạn có thể bắt đầu . e $_private_variable) để cho các lập trình viên khác đang đọc mã của bạn biết ngay rằng đó là một biến riêng tư, tuyệt vời.

Sự khác biệt giữa các biến công khai và riêng tư là gì?

Biến công khai, là các biến hiển thị cho tất cả các lớp. Biến riêng, là những biến chỉ hiển thị với lớp mà chúng thuộc về .

Làm cách nào để truy cập tài sản riêng trong PHP?

php sử dụng PhpPrivateAccess \MyClass; . $đóng cửa = \Đóng cửa. liên kết (hàm (MyClass $class) { return $class->property; }, null, MyClass. tầng lớp); . "

Làm cách nào để truy cập biến riêng trong một lớp khác trong PHP?

Bạn cần đặt quyền truy cập thành được bảo vệ. Riêng tư có nghĩa là nó chỉ có thể được truy cập từ bên trong lớp của chính nó và không thể kế thừa. Được bảo vệ cho phép nó được kế thừa nhưng vẫn không thể truy cập trực tiếp từ bên ngoài lớp. Lưu câu trả lời này