Hướng dẫn how to access private variable outside the class in php - cách truy cập biến private bên ngoài lớp trong php

Tôi đã bắt nguồn một lớp từ

class SpecialException extends MyException {

    private $_type = "superspecial";

}
0, về cơ bản như vậy:

class MyException extends Exception {

    private $_type;

    public function type() {
        return $this->_type; //line 74
    }

    public function __toString() {

        include "sometemplate.php";
        return "";

    }

}

Sau đó, tôi bắt nguồn từ

class SpecialException extends MyException {

    private $_type = "superspecial";

}
1 như vậy:

class SpecialException extends MyException {

    private $_type = "superspecial";

}

Nếu tôi

class SpecialException extends MyException {

    private $_type = "superspecial";

}
2 từ một hàm, hãy bắt nó và đi
class SpecialException extends MyException {

    private $_type = "superspecial";

}
3, thì hàm
class SpecialException extends MyException {

    private $_type = "superspecial";

}
4 sẽ tải một mẫu, hiển thị điều đó, và sau đó không thực sự trả lại bất cứ điều gì cho Echo.

Đây về cơ bản là những gì trong tệp mẫu

message; ?>

Trong tâm trí của tôi, điều này chắc chắn nên làm việc. Tuy nhiên, tôi gặp lỗi sau khi bị loại bỏ ngoại lệ và tôi cố gắng hiển thị nó:

Lỗi gây tử vong: Không thể truy cập thuộc tính riêng biệt cụ thể: Cannot access private property SpecialException::$_type in C:\path\to\exceptions.php on line 74

Bất cứ ai có thể giải thích tại sao tôi phá vỡ các quy tắc ở đây? Tôi đang làm điều gì đó dí dỏm khủng khiếp với mã này? Có một cách thành ngữ nào để xử lý tình huống này? Điểm của biến

class SpecialException extends MyException {

    private $_type = "superspecial";

}
5 là (như được hiển thị) rằng tôi muốn một lớp Div khác được sử dụng tùy thuộc vào loại ngoại lệ bị bắt.

Để đặt quyền truy cập cho các phương thức và biến lớp, chúng tôi sử dụng các sửa đổi truy cập không có gì ngoài các từ khóa PHP. Chúng tôi thậm chí có thể chỉ định một số bộ sửa đổi truy cập này cho bản thân 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 bộ điều chỉnh truy cập cùng với ý nghĩa của chúng:keywords which are used as access modifiers along with their meaning:

  1. class SpecialException extends MyException {
    
        private $_type = "superspecial";
    
    }
    
    6: Khi chúng tôi xác định các thành viên lớp là công khai, thì họ có thể truy cập từ bất cứ đâu, ngay cả từ bên ngoài phạm vi lớp học.
  2. class SpecialException extends MyException {
    
        private $_type = "superspecial";
    
    }
    
    7: Khi chúng tôi xác định các thành viên lớp là riêng tư, họ chỉ có thể được truy cập từ bên trong lớp.
  3. class SpecialException extends MyException {
    
        private $_type = "superspecial";
    
    }
    
    8: Điều này giống như riêng tư, với một ngoại lệ, các thành viên lớp được xác định là được bảo vệ 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 sẽ tìm hiểu về kế thừa).
  4. class SpecialException extends MyException {
    
        private $_type = "superspecial";
    
    }
    
    9: Từ khóa này chỉ được sử dụng cho các lớp PHP và các chức năng thành viên của nó.
  5. message; ?>

    0: Các phương thức lớp được xác định 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 trình sửa đổi truy cập nào

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

Modifer truy cậpcác lớp họcchức năngbiến
public Không áp dụngÁp dụngÁp dụng
private Không áp dụngÁp dụngÁp dụng
protected Không áp dụngÁp dụngÁp dụng
abstract Áp dụngÁp dụngKhông áp dụng
final Áp dụngÁp dụngKhông áp dụng

Áp dụng


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 về các công cụ sửa đổi truy cập chi tiết cùng với các ví dụ.

class SpecialException extends MyException {

    private $_type = "superspecial";

}
6 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 quyền 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à

class SpecialException extends MyException {

    private $_type = "superspecial";

}
6 theo mặc định.

Như đã đề cập trong bảng trên, không thể sử dụng các bộ sửa đổi truy cập

class SpecialException extends MyException {

    private $_type = "superspecial";

}
6,
class SpecialException extends MyException {

    private $_type = "superspecial";

}
7 hoặc
class SpecialException extends MyException {

    private $_type = "superspecial";

}
8 với lớp. Hãy xem những 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) bất ngờ 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 lớp, chúng tôi nên chỉ định các nhà xác đị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 mã trên, chúng tôi đã sử dụng từ khóa

message; ?>

6 trước biến lớp. Nếu chúng tôi không sử dụng

message; ?>

6, chúng tôi sẽ gặp lỗi phân tích cú pháp.

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


class SpecialException extends MyException { private $_type = "superspecial"; } 7 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

class SpecialException extends MyException {

    private $_type = "superspecial";

}
7 cho các biến và phương thức lớp nhưng không phải cho lớp PHP. Khi một thành viên lớp - một biến hoặc một hàm, được khai báo là
class SpecialException extends MyException {

    private $_type = "superspecial";

}
7 thì nó không thể được truy cập trực tiếp bằng cách sử dụ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 mã trên,

2 và
3 là các biến lớp riêng, do đó chúng ta không thể trực tiếp truy cậ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ẽ gặp lỗi PHP gây tử vong:

Lỗi chết người: Không thể truy cập vào tài sản riêng :: $ fname trong ...

Nhưng chúng ta có thể dễ dàng truy cập các biến riêng tư của một lớp bằng cách xác định các chức năng công cộng trong lớp. Chúng ta có thể tạo các chức năng riêng biệt để đặt giá trị thành các biến riêng tư và để nhận giá trị của chúng. Các chức năng này được gọi là getters và setters.Getters and 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 trong lớp.


class SpecialException extends MyException { private $_type = "superspecial"; } 8 Công cụ sửa đổi truy cập

Giống như trình sửa đổi truy cập

class SpecialException extends MyException {

    private $_type = "superspecial";

}
7,
class SpecialException extends MyException {

    private $_type = "superspecial";

}
8 Modifer truy cập cũng hạn chế truy cập các biến và phương thức lớp bên ngoài lớp. Nhưng các biến và hàm lớp
class SpecialException extends MyException {

    private $_type = "superspecial";

}
8 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 ra một lớp con và về khái niệm về sự kế thừa trong các hướng dẫn sắp tới.

Hãy lấy một ví dụ nhanh chóng 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,

8 và
9. Lớp
9 là một lớp con của lớp
8.

Trong lớp

8, tất cả các biến và phương thức lớp là
class SpecialException extends MyException {

    private $_type = "superspecial";

}
8, 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
8.

Đừng lo lắng nếu điều này có vẻ khó hiểu do khái niệm thừa kế, chúng ta sẽ một lần nữa ghé thăm lại điều này, khi chúng ta sẽ tìm hiểu về thừa kế.Inheritance, we will again re-visit this, when we will learn about Inheritance.


class SpecialException extends MyException { private $_type = "superspecial"; } 9 Công cụ sửa đổi truy cập

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

class SpecialException extends MyException {

    private $_type = "superspecial";

}
9 đượ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í có một phương thức

class SpecialException extends MyException {

    private $_type = "superspecial";

}
9 duy nhất. sau đó lớp cũng phải được định nghĩa là
class SpecialException extends MyException {

    private $_type = "superspecial";

}
9.

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

class SpecialException extends MyException {

    private $_type = "superspecial";

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

Chúng tôi sẽ tìm hiểu về công cụ sửa đổi truy cập này một cách chi tiết khi chúng tôi sẽ bao gồm các lớp và giao diện trừu tượng.


message; ?>

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

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

message; ?>

0, 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 xác định hàm lớp là

message; ?>

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

message; ?>

0.

Một lần nữa, chúng tôi sẽ giải thích điều này với sự giúp đỡ của các ví dụ khi chúng tôi sẽ tìm hiểu về thừa kế.



Làm thế nào tôi có thể truy cập biến riêng từ một lớp khác trong PHP?

Chúng ta có thể truy cập một biến riêng tư trong một lớp khác bằng cách đặt biến đó theo phương thức công khai và gọi phương thức đó từ một lớp khác bằng cách tạo đối tượng của lớp đó. Ví dụ: Sử dụng hệ thống; Sử dụng hệ thống.putting that variable with in a Public method and calling that method from another class by creating object of that class. Example: using System; using System.

Làm thế nào để bạn truy cập các biến riêng bên ngoài lớp?

Bạn có thể truy cập các phương thức riêng tư của một lớp bằng gói phản xạ Java ...
Bước 1 - khởi tạo lớp phương pháp của Java. Lang. ....
Bước 2 - Đặt phương thức có thể truy cập bằng cách chuyển giá trị true cho phương thức setAccessible () ..
Bước 3 - Cuối cùng, gọi phương thức bằng phương thức gọi () ..

Làm thế nào để bạn gọi một phương thức riêng bên ngoài lớp trong PHP?

Điều này sẽ dẫn đến một ReflectionException ('cố gắng gọi phương thức riêng tư từ Phạm vi phản xạMethod').- Webbiedave.....
API phản xạ PHP không hỗ trợ gọi các phương thức riêng tư.Bạn chỉ cần một $ Reflection_method-> setAccessible (true) sau $ referction_method = $ refrection_class-> getMethod ("myprivatemethod").

Làm thế nào tôi có thể truy cập các thuộc tính riêng trong PHP?

Cách truy cập vào tài sản hoặc phương thức riêng trong PHP..
class foo {chức năng riêng tư privateMethod () {return 'howdy';}} $ foo = new foo;$ foo-> privateMethod ();....
$ ReflectionMethod = new ReflectionMethod ('foo', 'PrivateMethod');$ ReflectionMethod-> setAccessible (true);echo $ ReflectionMethod-> gọi (foo mới) ;.