Доступ к закрытой функции из внешнего класса - PullRequest
2 голосов
/ 15 ноября 2011

Я изучаю ОО, и наткнулся на это:

class n{

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

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

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

Разве это не превосходит цель объявления функций private, если я смогу получить к нему доступ еще из-за пределов класса?Разве это не должно быть полностью заблокировано?Я что-то пропустил?Пожалуйста, помогите прояснить.Спасибо

Ответы [ 9 ]

7 голосов
/ 15 ноября 2011

Открытые функции предназначены для выполнения операций с экземпляром этого класса.Скажем, Save().

Внутренняя работа Save() не интересует вызывающего;он просто хочет сохранить его, и ему все равно, как это происходит.

Как стиль, вы можете или не хотите выполнять сохранение в этом методе.Это может зависеть от выбора дизайна или свойств объекта.См .:

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

Вы не хотите, чтобы кто-либо вызывал приватные методы напрямую, потому что они предназначены только для внутреннего использования.Однако открытый метод может косвенно вызывать закрытый метод.

5 голосов
/ 15 ноября 2011

Вы упустили момент, что вы не вызываете метод private извне. Вы вызываете метод public (отсутствует модификатор видимости = public) извне, а оттуда вызываете метод private из внутри класса.

4 голосов
/ 15 ноября 2011

Объявление вещей private просто скрывает их от открытого интерфейса. Вы имеете полное право делать такие вещи, как в вашем фрагменте кода; т.е. реализовать открытый интерфейс в терминах «скрытых» частных внутренних методов.

Если бы вы писали библиотеку, вы, вероятно, оставили бы свой публичный интерфейс четко определенным и попытались бы минимизировать изменения между выпусками (чтобы пользователям не приходилось поддерживать свой код). Но вы могли бы свободно модифицировать внутренние материалы любым удобным для вас способом, без каких-либо затрат для пользователя.

2 голосов
/ 15 ноября 2011

Вы не можете вызвать свою функцию даже из своего кода, вы вызываете

$this->f(5);

через вызов

c()

Вы не сможете вызвать f ()с другим параметром, по крайней мере в коде, который вы опубликовали.

Но нет, вызов частных методов из открытых не является запахом кода .

Я имею в виду,откуда еще можно ожидать их вызова, если не из открытых методов?

1 голос
/ 15 ноября 2011

Ваш код верен, однако, если вы не укажете разрешение метода (т. Е. Публичное, частное или защищенное), ему будет назначено поведение по умолчанию для общедоступного. Таким образом, ваша функция c () на самом деле общедоступна, поэтому вы можете вызывать ее извне класса.

Если вы переключите его на частный или защищенный, вы получите ожидаемую ошибку.

1 голос
/ 15 ноября 2011

Вы не можете позвонить $o->f() напрямую извне, что все, что private должно защищать.Если вы не можете вызвать метод private, если любой метод public задействован где-либо в стеке вызовов, вы не сможете вызвать его вообще. Некоторый метод вашего класса должен вызываться извне;и затем может делать звонки внутри страны.

1 голос
/ 15 ноября 2011

Метод private означает, что он выполняет внутреннюю работу, которая не касается внешнего мира (вне класса).

0 голосов
/ 28 октября 2017
    <?php
//Accessing private method in php with parameter
    class Foo {
        private function validateCardNumber($number)
        {   
            echo $number;
        }
    }
    $method = new ReflectionMethod('Foo', 'validateCardNumber');
    $method->setAccessible(true);

    echo $method->invoke(new Foo(), '1234-1234-1234');
    ?>
0 голосов
/ 15 ноября 2011

Если ваш класс не единственный (который содержит метод main (), вызываемый механизмом запуска), где-то в вызове класса должна быть внешняя сторона вызова класса, иначе его методы никогда не звонил.

...