Hướng dẫn how can i access private variable from another class in php? - làm cách nào tôi có thể truy cập biến riêng tư từ một lớp khác trong php?

Tôi đã bắt nguồn một lớp từ Exception, 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ừ MyException như vậy:

class SpecialException extends MyException {

    private $_type = "superspecial";

}

Nếu tôi throw new SpecialException("bla") từ một hàm, hãy bắt nó và đi

class SpecialException extends MyException {

    private $_type = "superspecial";

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

    private $_type = "superspecial";

}
1 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";

}
2 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.

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 cứ nơi nào trong tập lệnh của bạn, thường không phải là một điều thông minh. Hãy nghĩ lại trước đây - chúng tôi đã có một đối tượng Dogtag $ Dogtag bên trong mỗi đối tượng chó cũng như biến tên $, nhưng họ đã lặp lại thông tin bên trong.$DogTag inside each dog object as well as a $Name variable, but they had repeated information inside.

Nếu chúng tôi đã thay đổi biến $ name, $ Dogtag có được cập nhật tự động không? Tất nhiên là không - nó sẽ vẫn giữ nguyên, khác với giá trị tên $ mới:$Name variable, would $DogTag have been updated automatically? Of course not - it would have remained the same, which was different to the new $Name value:

$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 vì chúng tôi đã cho phép bất kỳ phần nào trong kịch bản của chúng tôi truy cập trực tiếp vào phần bên trong của các đối tượng 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 chó đã nhúng logic vào đó 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ẻ chó của nó sẽ được cập nhật chỉ bằng một cuộc gọi.

Tuy nhiên, với tập lệnh trên, vẫn có thể một số lập trình viên vô đạo đức, lười biếng hoặc thiếu hiểu biết để 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à nơi các biến riêng tư xuất hiện - chúng tôi có thể hướng dẫn PHP rằng tên $ $ là riêng tư và do đó chỉ có thể được thay đổi với lớp của nó. Đây là mã mới:$Name is private, and can therefore only be changed with the class its part of. Here is the new code:

class dog {
    private $Name;
    private $DogTag;

    public function setName($NewName) {
        

Lưu ý rằng cả $ name và $ dogtag đều riêng tư, điều đó 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 còn công khai - chúng tôi muốn điều này có thể truy cập được bởi bất kỳ ai.$Name and $DogTag are private, which means no one can access them unless doing so in a function that is part of the object, such as setName(). Note that setName() itself remains public - we want this to be accessible by anyone.

Bây giờ nếu lập trình viên lười biếng của chúng tôi xuất hiện và cố gắng đặt tên $ trực tiếp bằng cách sử dụng mã như $ poppy-> tên, 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 một biến riêng, PHP trực tiếp sẽ tự động tìm ra thông báo lỗi. Tuy nhiên, nếu biến riêng tư đó đượ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à biến công khai. Vâng, điều này có phần khó hiểu, tuy nhiên mã sau đây sẽ xóa mọi thứ:$Name directly using code like $poppy->Name, they will not get what they were expecting. You see, if they try to alter a private variable directly PHP will automatically spit out an error message. However, if that private variable was inherited from another class, PHP will try to accommodate their request by having a private variable and a public variable. Yes, this is somewhat confusing, however the following code should clear things up:

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

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

class SpecialException extends MyException {

    private $_type = "superspecial";

}
3

Lưu ý rằng có hai biến tên - một biến riêng tư và không thể chạm vào, và một biến khác mà PHP tạo ra cho sử dụng cục bộ theo yêu cầu. Rõ ràng điều này thật khó hiểu, 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 tư 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 chức năng cha riêng. Để làm điều này, bạn cần từ khóa được bảo vệ thay thế.

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

Hack với 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 tập PHP thực hành ngay hôm nay!over 1200 pages of hands-on PHP learning today!

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

Chương tiếp theo: Được bảo vệ >>

Chương trước: công khai

Nhảy đến:

Trang chủ: Bảng nội dung

Bản quyền © 2015 Paul Hudson. Theo dõi tôi: @twostraws.

Chúng ta có thể truy cập biến riêng từ một lớp khác không?

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.. Example: using System; using System.

Làm thế nào bạn có thể gán các giá trị cho các biến riêng tư của một lớp khác trong PHP?

Sử dụng hàm __setter (__set) để đặt (các) giá trị cho biến riêng của bạn bên trong một lớp và khi cần giá trị, hãy sử dụng hàm __getter (__get) để trả về các giá trị., and when the value is needed, use the __getter (__get) function to return the values.

Làm thế nào chúng ta có thể truy cập biến riêng trong lớp?

Chúng tôi đã sử dụng phương thức Getter và Setter để truy cập các biến riêng tư.Ở đây, các phương thức setter setage () và setName () khởi tạo các biến riêng tư.Các phương thức getter getage () và getName () trả về giá trị của các biến riêng tư.getter and setter method to access the private variables. Here, the setter methods setAge() and setName() initializes the private variables. the getter methods getAge() and getName() returns the value of private variables.