Hướng dẫn how can i access private properties in php? - làm thế nào tôi có thể truy cập các thuộc tính riêng tư trong php?

Điều này nghe có vẻ như một câu hỏi phỏng vấn tầm thường, chúng tôi biết. Bạn có thể dễ dàng tìm thấy một phương pháp được ghi chép lại với sự phản ánh. Một số bậc thầy thực sự thậm chí còn cung cấp cho chúng tôi những cách không phản ánh khác để làm điều tương tự. Tuy nhiên, khi bạn bắt đầu tự thực hiện nó, bạn có thể gặp nhiều vấn đề bất ngờ và kỳ lạ. Chúng bao gồm, nhưng không giới hạn ở:

Bạn không thể làm điều đó trong một dòng chỉ đơn giản là sử dụng phản xạ.

Bạn cần phải chơi xung quanh với đối tượng API phản xạ, nhưng bạn không dám quên gọi setAccessible(true) trước:

Ảnh chụp màn hình chính hãng từ giải pháp stackoverflow.

Tài sản riêng của cha mẹ don lồng đếm ¯ \ _ (ツ) _/¯

Điều đó đúng: Nếu bạn cố gắng truy cập một tài sản riêng được kế thừa từ lớp cha, đoạn mã mã StackOverflow được phê duyệt sẽ thất bại:private property that was inherited from a parent class, the approved Stackoverflow code snippet will fail:

Truy cập vào tư nhân cha mẹ thất bại trong PHP

Tôi chắc chắn rằng có một lời giải thích hợp lý, học thuật cho hành vi này. Nếu bạn biết tại sao, xin vui lòng chia sẻ nó với chúng tôi trong các ý kiến. Có thể một cái gì đó như:

Các thuộc tính riêng của các lớp cha không thể được truy cập trong thời gian chạy từ bên trong một lớp con. Do đó, chúng cũng không thể được truy cập thông qua API phản xạ.

Chúng ta có thể thấy một sự khác biệt nhỏ trong thông báo lỗi PHP trên ảnh chụp màn hình từ 3v4l.org: Thay vì thuộc tính của P không tồn tại. Điều này ngụ ý rằng các lớp phụ huynh thuộc tính của các lớp thậm chí không được xem qua.

Nếu bạn nghĩ về nó, bạn không thể truy cập vào các tài sản riêng tư của cha mẹ bạn khi còn nhỏ, vì vậy nó có ý nghĩa.

Tất cả những trò đùa sang một bên, làm thế nào chúng ta có thể đọc tài sản riêng của một đối tượng trong PHP? Và chúng tôi có thể bao gồm các thuộc tính riêng của tất cả các lớp phụ huynh với một dòng mã tự giải thích duy nhất không? Đã có một thư viện vi mô ngoài kia cho mục đích chính xác này: Phản hồi PHP. Hãy để kiểm tra một ví dụ:

Vấn đề đã được giải quyết.

Nó dường như không hoạt động:

$ref = new ReflectionObject($obj);

if($ref->hasProperty('privateProperty')){
  print_r($ref->getProperty('privateProperty'));
}

Nó được đưa vào vòng lặp IF, sau đó ném một lỗi:

Tài sản privateproperty không tồn tại

: |

$ref = new ReflectionProperty($obj, 'privateProperty') cũng không hoạt động ...

Trang tài liệu liệt kê một vài hằng số, bao gồm IS_PRIVATE. Làm thế nào tôi có thể sử dụng nó nếu tôi không thể truy cập một tài sản riêng lẻ lol?

Đã hỏi ngày 22 tháng 7 năm 2012 lúc 23:51Jul 22, 2012 at 23:51

1

class A
{
    private $b = 'c';
}

$obj = new A();

$r = new ReflectionObject($obj);
$p = $r->getProperty('b');
$p->setAccessible(true); // <--- you set the property to public before you read the value

var_dump($p->getValue($obj));

Đã trả lời ngày 22 tháng 7 năm 2012 lúc 23:54Jul 22, 2012 at 23:54

Hướng dẫn how can i access private properties in php? - làm thế nào tôi có thể truy cập các thuộc tính riêng tư trong php?

Zerkmszerkmszerkms

244K67 Huy hiệu vàng430 Huy hiệu bạc532 Huy hiệu Đồng67 gold badges430 silver badges532 bronze badges

10

class A
{
    private $b = 'c';
}

$obj = new A();

$r = new ReflectionObject($obj);
$p = $r->getProperty('b');
$p->setAccessible(true); // <--- you set the property to public before you read the value

var_dump($p->getValue($obj));
0 ném một ngoại lệ, không phải là một lỗi. Ý nghĩa là, bạn có thể xử lý nó và tiết kiệm cho mình một
class A
{
    private $b = 'c';
}

$obj = new A();

$r = new ReflectionObject($obj);
$p = $r->getProperty('b');
$p->setAccessible(true); // <--- you set the property to public before you read the value

var_dump($p->getValue($obj));
1:

$ref = new ReflectionObject($obj);
$propName = "myProperty";
try {
  $prop = $ref->getProperty($propName);
} catch (ReflectionException $ex) {
  echo "property $propName does not exist";
  //or echo the exception message: echo $ex->getMessage();
}

Để có được tất cả các thuộc tính riêng, hãy sử dụng

class A
{
    private $b = 'c';
}

$obj = new A();

$r = new ReflectionObject($obj);
$p = $r->getProperty('b');
$p->setAccessible(true); // <--- you set the property to public before you read the value

var_dump($p->getValue($obj));
2

Mikeschinkel

4.8994 Huy hiệu vàng36 Huy hiệu bạc46 Huy hiệu đồng4 gold badges36 silver badges46 bronze badges

Đã trả lời ngày 23 tháng 7 năm 2012 lúc 0:04Jul 23, 2012 at 0:04

Hướng dẫn how can i access private properties in php? - làm thế nào tôi có thể truy cập các thuộc tính riêng tư trong php?

1

Trong trường hợp bạn cần nó mà không có sự phản ánh:without reflection:

public function propertyReader(): Closure
{
    return function &($object, $property) {
        $value = &Closure::bind(function &() use ($property) {
            return $this->$property;
        }, $object, $object)->__invoke();
         return $value;
    };
}

Và sau đó chỉ cần sử dụng nó (trong cùng một lớp) như thế này:

$object = new SomeObject();
$reader = $this->propertyReader();
$result = &$reader($object, 'some_property');

Đã trả lời ngày 30 tháng 10 năm 2019 lúc 13:48Oct 30, 2019 at 13:48

Không có sự phản ánh, người ta cũng có thể làm reflection, one can also do

class SomeHelperClass {
    // Version 1
    public static function getProperty1 (object $object, string $property) {
        return Closure::bind(
            function () use ($property) {
                return $this->$property;
            },
            $object,
            $object
        )();
    }

    // Version 2
    public static function getProperty2 (object $object, string $property) {
        return (
            function () use ($property) {
                return $this->$property;
            }
        )->bindTo(
            $object,
            $object
        )->__invoke();
    }
}

Và sau đó một cái gì đó giống như

SomeHelperClass::getProperty1($object, $propertyName)
SomeHelperClass::getProperty2($object, $propertyName)

nên làm việc.

Đây là phiên bản đơn giản hóa câu trả lời của Nikola StojiljkovićNikola Stojiljković's answer

Đã trả lời ngày 2 tháng 5 lúc 14:13May 2 at 14:13

Làm thế nào để bạn truy cập các thuộc tính của một đối tượng trong PHP?

Trong các phương thức lớp các thuộc tính không tĩnh có thể được truy cập bằng cách sử dụng-> (toán tử đối tượng): $ this-> thuộc tính (trong đó thuộc tính là tên của thuộc tính). Thuộc tính tĩnh được truy cập bằng cách sử dụng :: (Double Colon): Self :: $ $ thuộc tính.non-static properties may be accessed by using -> (Object Operator): $this->property (where property is the name of the property). Static properties are accessed by using the :: (Double Colon): self::$property .

Làm thế nào để bạn truy cập thuộc tính riêng và các phương thức bên ngoài lớp bằng cách sử dụng đối tượng lớp trong PHP?

Như bạn có thể thấy, PrivateMethod là một phương thức riêng tư và nếu chúng ta muốn truy cập nó bên ngoài lớp như vậy, chúng ta sẽ gặp lỗi nghiêm trọng.Để khắc phục điều này, chúng ta có thể sử dụng lớp ReflectionMethod được xây dựng của PHP có thể cung cấp đầy đủ thông tin về lớp.use PHP's in-built ReflectionMethod class which can give handlful of information about the class.

Hàm riêng PHP là gì?

Từ khóa riêng là một công cụ sửa đổi truy cập.Nó đánh dấu một tài sản hoặc phương pháp là riêng tư.Các thuộc tính và phương thức riêng chỉ có thể được sử dụng bởi lớp trong đó thuộc tính hoặc phương thức được xác định.Các lớp có nguồn gốc và mã bên ngoài không thể sử dụng chúng.an access modifier. It marks a property or method as private. Private properties and methods can only be used by the class in which the property or method was defined. Derived classes and outside code cannot use them.

Tại sao chúng ta sử dụng $ này trong PHP?

$ Đây là một từ khóa dành riêng trong PHP đề cập đến đối tượng gọi.Nó thường là đối tượng mà phương thức thuộc về, nhưng có thể là một đối tượng khác nếu phương thức được gọi là tĩnh từ bối cảnh của một đối tượng thứ cấp.refers to the calling object. It is usually the object to which the method belongs, but possibly another object if the method is called statically from the context of a secondary object.