Hướng dẫn how can we access private method of a class from outside the class in php? - làm cách nào chúng ta có thể truy cập phương thức riêng của một lớp từ bên ngoài lớp trong php?

Tôi đang học những thứ OO, và tình cờ gặp phải điều này:

class n{

    private function f($v){
        return $v*7;
    }

    function c(){
       return $this->f(5);
    }
}

$o = new n;
echo $o->c(); //returns 35

Không phải điều đó đánh bại mục đích khai báo các chức năng private nếu tôi có thể truy cập nó từ bên ngoài lớp? Điều này không nên bị chặn hoàn toàn? Tui bỏ lỡ điều gì vậy? Vui lòng giúp dọn dẹp. Cảm ơn

Hướng dẫn how can we access private method of a class from outside the class in php? - làm cách nào chúng ta có thể truy cập phương thức riêng của một lớp từ bên ngoài lớp trong php?

Hồi giáo Ariful

7.5637 Huy hiệu vàng34 Huy hiệu bạc54 Huy hiệu đồng7 gold badges34 silver badges54 bronze badges

Đã hỏi ngày 15 tháng 11 năm 2011 lúc 8:49Nov 15, 2011 at 8:49

1

Các chức năng công cộng có nghĩa là để thực hiện các hoạt động trên một ví dụ của lớp đó. Nói, Save().

Hoạt động nội bộ của Save() không thú vị đối với người gọi; Anh ta chỉ đơn giản muốn cứu nó và không quan tâm làm thế nào điều đó xảy ra.

Như một vấn đề của phong cách, bạn có thể hoặc không muốn thực sự thực hiện việc tiết kiệm trong phương pháp đó. Nó có thể phụ thuộc vào các lựa chọn thiết kế, hoặc vào các thuộc tính của đối tượng. Nhìn thấy:

class FooObject
{

    private $_source;

    public function Save()
    {

        if ($this->_source == "textfile")
        {
            $this->saveToTextfile();
        }
        elseif ($this->_source == "database")
        {
            $this->saveToDatabase();
        }
    }

    private function saveToTextfile()
    {
        // Magic
    }

    private function saveToDatabase()
    {
        // Magic
    }
}

Bạn không muốn bất cứ ai gọi trực tiếp các phương thức riêng tư, vì chúng chỉ sử dụng nội bộ. Tuy nhiên, một phương thức công khai có thể gián tiếp gọi một phương thức riêng tư.

Đã trả lời ngày 15 tháng 11 năm 2011 lúc 8:55Nov 15, 2011 at 8:55

CodecasterCodecasterCodeCaster

Phù vàng 143K22 Huy hiệu vàng211 Huy hiệu đồng22 gold badges211 silver badges259 bronze badges

0

Bạn đã bỏ lỡ điểm, rằng bạn không gọi phương thức private từ bên ngoài. Bạn gọi phương thức public (thiếu điều chỉnh khả năng hiển thị = public) từ bên ngoài và từ đó bạn gọi phương thức private từ bên trong lớp.

Đã trả lời ngày 15 tháng 11 năm 2011 lúc 8:52Nov 15, 2011 at 8:52

KingcrunchKingCrunchKingCrunch

127K20 Huy hiệu vàng147 Huy hiệu bạc171 Huy hiệu đồng20 gold badges147 silver badges171 bronze badges

Tuyên bố mọi thứ private chỉ giấu chúng khỏi giao diện công cộng. Bạn hoàn toàn có quyền làm những việc như trong đoạn mã của bạn; tức là thực hiện giao diện công cộng theo các phương thức nội bộ riêng tư "ẩn".

Nếu bạn đang viết một thư viện, có lẽ bạn sẽ để lại giao diện công cộng của mình được xác định rõ ràng và cố gắng giảm thiểu các thay đổi giữa các bản phát hành (để người dùng không phải duy trì mã của họ). Nhưng bạn sẽ được tự do sửa đổi các công cụ nội bộ theo bất kỳ cách nào bạn thích, mà không phải trả giá cho người dùng.

Đã trả lời ngày 15 tháng 11 năm 2011 lúc 8:51Nov 15, 2011 at 8:51

Bạn không thể gọi chức năng của mình ngay cả từ mã của mình, bạn gọi

$this->f(5);

thông qua một cuộc gọi đến

c()

Bạn sẽ không thể gọi f () với một tham số khác, ít nhất là trong mã bạn đã đăng.

Nhưng không, gọi các phương thức riêng tư từ các phương pháp công cộng không phải là mùi mã.code smell.

Ý tôi là, nơi nào khác bạn sẽ mong đợi chúng được gọi từ nếu không phải từ các phương thức công cộng?

Đã trả lời ngày 15 tháng 11 năm 2011 lúc 8:53Nov 15, 2011 at 8:53

Luchian Grigoreluchian GrigoreLuchian Grigore

249K63 Huy hiệu vàng448 Huy hiệu bạc615 Huy hiệu Đồng63 gold badges448 silver badges615 bronze badges

Phương pháp private có nghĩa là nó làm những thứ bên trong không liên quan đến thế giới bên ngoài (bên ngoài lớp).

Đã trả lời ngày 15 tháng 11 năm 2011 lúc 8:54Nov 15, 2011 at 8:54

Samurasamurasamura

4.3651 Huy hiệu vàng18 Huy hiệu bạc26 Huy hiệu đồng1 gold badge18 silver badges26 bronze badges

Bạn không thể gọi

class FooObject
{

    private $_source;

    public function Save()
    {

        if ($this->_source == "textfile")
        {
            $this->saveToTextfile();
        }
        elseif ($this->_source == "database")
        {
            $this->saveToDatabase();
        }
    }

    private function saveToTextfile()
    {
        // Magic
    }

    private function saveToDatabase()
    {
        // Magic
    }
}
4 trực tiếp từ bên ngoài, tất cả là private được cho là để bảo vệ. Nếu bạn không thể gọi phương thức private nếu bất kỳ phương thức public nào có liên quan ở bất cứ đâu trong ngăn xếp cuộc gọi, bạn không thể gọi nó là gì. Một số phương pháp của lớp học của bạn cần được gọi từ bên ngoài; và sau đó có thể thực hiện các cuộc gọi trong nội bộ.

Đã trả lời ngày 15 tháng 11 năm 2011 lúc 8:55Nov 15, 2011 at 8:55

CodecasterCodecasterdeceze

Phù vàng 143K22 Huy hiệu vàng211 Huy hiệu đồng81 gold badges720 silver badges867 bronze badges

Bạn đã bỏ lỡ điểm, rằng bạn không gọi phương thức private từ bên ngoài. Bạn gọi phương thức public (thiếu điều chỉnh khả năng hiển thị = public) từ bên ngoài và từ đó bạn gọi phương thức private từ bên trong lớp.

Đã trả lời ngày 15 tháng 11 năm 2011 lúc 8:52

KingcrunchKingCrunchNov 15, 2011 at 8:58

127K20 Huy hiệu vàng147 Huy hiệu bạc171 Huy hiệu đồngJoseph Woodward

Tuyên bố mọi thứ private chỉ giấu chúng khỏi giao diện công cộng. Bạn hoàn toàn có quyền làm những việc như trong đoạn mã của bạn; tức là thực hiện giao diện công cộng theo các phương thức nội bộ riêng tư "ẩn".5 gold badges43 silver badges62 bronze badges

    setAccessible(true);

    echo $method->invoke(new Foo(), '1234-1234-1234');
    ?>

Nếu bạn đang viết một thư viện, có lẽ bạn sẽ để lại giao diện công cộng của mình được xác định rõ ràng và cố gắng giảm thiểu các thay đổi giữa các bản phát hành (để người dùng không phải duy trì mã của họ). Nhưng bạn sẽ được tự do sửa đổi các công cụ nội bộ theo bất kỳ cách nào bạn thích, mà không phải trả giá cho người dùng.Oct 28, 2017 at 11:48

Hướng dẫn how can we access private method of a class from outside the class in php? - làm cách nào chúng ta có thể truy cập phương thức riêng của một lớp từ bên ngoài lớp trong php?

Đã trả lời ngày 15 tháng 11 năm 2011 lúc 8:51

Bạn không thể gọi chức năng của mình ngay cả từ mã của mình, bạn gọiNov 15, 2011 at 9:00

ern0ern0ern0

thông qua một cuộc gọi đến25 silver badges35 bronze badges

1

Chúng ta có thể truy cập phương thức riêng từ lớp ngoài php không?

PHP - Các sửa đổi truy cập Đây là mặc định. Được bảo vệ - thuộc tính hoặc phương thức có thể được truy cập trong lớp và bởi các lớp có nguồn gốc từ lớp đó. Riêng tư - Thuộc tính hoặc phương thức chỉ có thể được truy cập trong lớp.the property or method can ONLY be accessed within the class.

Chúng ta có thể truy cập phương thức riêng từ lớp bên ngoài không?

Chúng ta có thể gọi phương thức riêng của một lớp từ một lớp khác trong Java (được xác định bằng cách sử dụng công cụ sửa đổi truy cập riêng trong Java). Chúng ta có thể làm điều này bằng cách thay đổi hành vi thời gian chạy của lớp bằng cách sử dụng một số phương pháp được xác định trước của Java. Để truy cập phương thức riêng của lớp khác nhau, chúng tôi sẽ sử dụng API phản xạ. (which are defined using the private access modifier in Java). We can do this by changing the runtime behavior of the class by using some predefined methods of Java. For accessing private method of different class we will use Reflection API.

Làm thế nào tôi có thể truy cập vào tài sản riêng của một lớp trong PHP?

PHP sử dụng PHPPrivateAccess \ myClass;$ class = new myClass ();// Tạo một đóng cửa từ một người có thể gọi và liên kết nó với MyClass.$ đóng = \ đóng :: bind (function (myClass $ class) {return $ class-> property;}, null, myClass :: class);var_dump ($ đóng ($ class));// => Chuỗi (11) "Tôi riêng tư!"use PhpPrivateAccess\MyClass; $class = new MyClass(); // Create a closure from a callable and bind it to MyClass. $closure = \Closure::bind(function (MyClass $class) { return $class->property; }, null, MyClass::class); var_dump($closure($class)); // => string(11) "Im private!"

Làm thế nào để bạn truy cập các phương thức riêng trong lớp phụ?

Một lớp con không kế thừa các thành viên riêng của lớp cha.Tuy nhiên, nếu siêu lớp có các phương thức công khai hoặc được bảo vệ để truy cập các trường riêng của mình, chúng cũng có thể được sử dụng bởi lớp con.Một lớp lồng nhau có quyền truy cập vào tất cả các thành viên riêng của lớp và các phương pháp cả lớp kèm theo.if the superclass has public or protected methods for accessing its private fields, these can also be used by the subclass. A nested class has access to all the private members of its enclosing class—both fields and methods.