PHP: вызов частного метода из класса, умирающего плохо - PullRequest
2 голосов
/ 08 сентября 2010

Так что это может звучать немного запутанно. Скрестив пальцы, я сталкиваюсь четко.

Я работаю в среде MVC на PHP.

Я загружаю контроллер / отчет / индекс, который обращается к помощнику

<? class ReportController extends Controller { 
        public function index() {
            $foo = MainReport::get_data($_REQUEST);
        }

   }
 ?>

Внутри помощника

<? class MainReport extends foo {
        public function get_data($_REQUEST) {
            // do stuff
            return $stuff_done;
        }

 }
?>

Это я запускаю это как ... это все хорошо. К сожалению, я хочу запустить его так:

<? class MainReport extends foo {
        private function do_stuff() { 
            // do even better stuff here!
            return $better_stuff;
        }
        public function get_data($_REQUEST) {
            // do stuff
            $x = $this->do_stuff();    
        }

 }
?>

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

Мне кажется очевидным, что у меня возникла какая-то дурацкая проблема с синтаксисом ... но как мне правильно получить доступ к закрытым функциям из класса?

Может быть, что-то вроде: самостоятельно :: do_stuff ();

А как насчет объявления и доступа к частным переменным класса?

 private $bar = array();

Любая помощь будет приветствоваться.

Ответы [ 2 ]

7 голосов
/ 08 сентября 2010

Вы вызываете свою функцию из статического контекста,

MainReport::get_data($_REQUEST)

поэтому $ этого не существует, пока внутри этой функции.

Если вы хотите вызывать другую функцию класса в статическом контексте, вы также должны вызывать ее статически.

т.е.

public function get_data($_REQUEST) {
        // do stuff
        $x = MainReport::do_stuff();    
    }

Кроме того, вы можете создать экземпляр вашего класса в исходном вызове и использовать экземпляр:

$myMainReport = new MainReport();
$myMainReport->get_data($_REQUEST);

Тогда ваш код класса будет работать как положено

1 голос
/ 08 сентября 2010

Я только что обнаружил, что self :: тоже работает

Если я хочу иметь закрытые переменные класса, я могу объявить и получить к ним доступ, используя

private static $foo

и

self::$foo = "foo";

дополнительно к приватной функции можно получить доступ с помощью

self::function_foo();
...