Hướng dẫn php reflection make method public - phản ánh php làm cho phương thức công khai

(Php 5> = 5.3.2, Php 7, Php 8)

ReflectionMethod :: SetAccessible - Đặt khả năng truy cập phương thứcSet method accessibility

Sự mô tả

PublicReflectionMethod :: SetAccessible (Bool $accessible): Void ReflectionMethod::setAccessible(bool $accessible): void

Lưu ý: Kể từ Php 8.1.0, gọi phương thức này không có hiệu lực; Tất cả các phương thức được mời theo mặc định.: As of PHP 8.1.0, calling this method has no effect; all methods are invokable by default.

Thông số

accessible

true để cho phép khả năng tiếp cận, hoặc false. to allow accessibility, or false.

Trả về giá trị

Không có giá trị được trả về.

Ví dụ

Ví dụ #1 Định nghĩa lớp đơn giản

class MyClass
{
    private function 
foo()
    {
        return 
'bar';
    }
}
$method = new ReflectionMethod("MyClass""foo");
$method->setAccessible(true);$obj = new MyClass();
echo 
$method->invoke($obj);
echo 
$obj->foo();
?>

Ví dụ trên sẽ xuất ra một cái gì đó tương tự như:

bar
Fatal error: Uncaught Error: Call to private method MyClass::foo() from global scope in /in/qdaZS:16

Xem thêm

  • RefrectionMethod :: isprivate () - Kiểm tra xem phương thức có riêng tư không
  • RefrectionMethod :: isProtected () - Kiểm tra xem phương thức có được bảo vệ không

Dave1010 tại Gmail Dot Com ¶

11 năm trước

class Console
{
    final public static function run() {

        while (TRUE != FALSE) {
            echo "\n> ";
            $command = trim(fgets(STDIN));

            switch ($command) {
                case 'exit':
                case 'q':
                case 'quit':
                    echo "OK+\n";
                    return;
                default:
                    ob_start();
                    eval($command);
                    $out = ob_get_contents();
                    ob_end_clean();

                    print("Command: $command");
                    print("Output:\n$out");         

                    break;
            }
        }
    }
}
0

class Console
{
    final public static function run() {

        while (TRUE != FALSE) {
            echo "\n> ";
            $command = trim(fgets(STDIN));

            switch ($command) {
                case 'exit':
                case 'q':
                case 'quit':
                    echo "OK+\n";
                    return;
                default:
                    ob_start();
                    eval($command);
                    $out = ob_get_contents();
                    ob_end_clean();

                    print("Command: $command");
                    print("Output:\n$out");         

                    break;
            }
        }
    }
}
1

class Console
{
    final public static function run() {

        while (TRUE != FALSE) {
            echo "\n> ";
            $command = trim(fgets(STDIN));

            switch ($command) {
                case 'exit':
                case 'q':
                case 'quit':
                    echo "OK+\n";
                    return;
                default:
                    ob_start();
                    eval($command);
                    $out = ob_get_contents();
                    ob_end_clean();

                    print("Command: $command");
                    print("Output:\n$out");         

                    break;
            }
        }
    }
}
2

class Console
{
    final public static function run() {

        while (TRUE != FALSE) {
            echo "\n> ";
            $command = trim(fgets(STDIN));

            switch ($command) {
                case 'exit':
                case 'q':
                case 'quit':
                    echo "OK+\n";
                    return;
                default:
                    ob_start();
                    eval($command);
                    $out = ob_get_contents();
                    ob_end_clean();

                    print("Command: $command");
                    print("Output:\n$out");         

                    break;
            }
        }
    }
}
3

Tôi muốn truy cập các phương thức và biến riêng tư từ bên ngoài các lớp trong các trường hợp cụ thể rất hiếm.

Tôi đã thấy rằng điều này là không thể mặc dù nội tâm được sử dụng.

Trường hợp cụ thể là trường hợp tiếp theo:

Tôi muốn có một cái gì đó như thế này:

class Console
{
    final public static function run() {

        while (TRUE != FALSE) {
            echo "\n> ";
            $command = trim(fgets(STDIN));

            switch ($command) {
                case 'exit':
                case 'q':
                case 'quit':
                    echo "OK+\n";
                    return;
                default:
                    ob_start();
                    eval($command);
                    $out = ob_get_contents();
                    ob_end_clean();

                    print("Command: $command");
                    print("Output:\n$out");         

                    break;
            }
        }
    }
}

Phương pháp này sẽ có thể được tiêm vào mã như thế này:

Class Demo
{
    private $a;

    final public function myMethod()
    {
        // some code
        Console::run();
        // some other code
    }

    final public function myPublicMethod()
    {
        return "I can run through eval()";
    }

    private function myPrivateMethod()
    {
        return "I cannot run through eval()";
    }
}

(Đây chỉ là một đơn giản hóa.

Vì thế...

Nếu bạn khởi tạo bản demo lớp và bạn gọi $ demo-> myMethod (), bạn sẽ nhận được một bảng điều khiển: Bảng điều khiển đó có thể truy cập phương thức đầu tiên viết lệnh như:

> $this->myPublicMethod();

Nhưng bạn không thể chạy thành công cái thứ hai:

> $this->myPrivateMethod();

Có ai trong số các bạn có bất kỳ ý tưởng nào, hoặc nếu có bất kỳ thư viện nào cho PHP cho phép bạn làm điều này?

Cảm ơn rất nhiều!

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 để bạn truy cập vào thuộc tính và phương thức riêng 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.

PHP có phản xạ không?

Thuật ngữ phản ánh trên mạng trong phát triển phần mềm có nghĩa là một chương trình biết cấu trúc của chính nó trong thời gian chạy và cũng có thể sửa đổi nó.Khả năng này cũng được gọi là nội tâm.Trong khu vực PHP, sự phản ánh được sử dụng để đảm bảo loại an toàn trong mã chương trình.In the PHP area, reflection is used to ensure type safety in the program code.

Phương pháp phản xạ trong PHP là gì?

Phát triển PHPWEB.Sự phản ánh thường được định nghĩa là khả năng của chương trình để kiểm tra chính nó và sửa đổi logic của nó tại thời điểm thực hiện.Trong các thuật ngữ kỹ thuật ít hơn, sự phản ánh là yêu cầu một đối tượng cho bạn biết về các thuộc tính và phương pháp của nó, và thay đổi những thành viên đó (thậm chí là riêng tư).a program's ability to inspect itself and modify its logic at execution time. In less technical terms, reflection is asking an object to tell you about its properties and methods, and altering those members (even private ones).