Статический метод PHP с использованием функций / переменных закрытого класса - PullRequest
5 голосов
/ 29 июля 2010

Если я пишу публичный статический метод в классе, т.е. ...

public static function get_info($type){
        switch($type){
            case'title':
                self::get_title(); 
                break;
        }
    }

Я должен написать свою функцию get_title () как public ...

public static function get_title(){
        return 'Title';
    }

В противном случаеЯ получаю ошибку:

Call to private method Page::get_title()

Что заставляет меня чувствовать, что функция get_info() по существу избыточна.Я хотел бы иметь возможность сделать вызов из статического метода в закрытый метод внутри моего класса для целей проверки.Разве это невозможно?

PHP> 5,0 между прочим.

! ####### РЕДАКТИРОВАТЬ РЕШЕНИЕ (НО НЕ ОТВЕТИТЬ НА ВОПРОС) #########!

Если вам интересно, мой обходной путь - создать экземпляр класса моей статической функции внутри статической функции.

Итак, имя класса было Page, я бы сделал это ...

public static function get_info($type){
            $page = new Page();
            switch($type){
                case'title':
                    $page->get_title(); 
                    break;
            }
        }
  public function get_title(){
            return 'Title';
        }

Ответы [ 2 ]

9 голосов
/ 29 июля 2010

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

Доступ (открытый, защищенный и закрытый) применяется к статическим классам (где все методы являются статическими), а также к экземплярам классов.

РЕДАКТИРОВАТЬ: Вам не нужно прибегать к созданию экземпляра класса для реализации частного доступа ...

// Enable full error reporting to make sure all is OK
error_reporting(E_ALL | E_STRICT);

class MyStaticClass {

 public static function get_info($type){
  switch($type){
   case 'title':
    return self::get_title(); 
    break;
   }
 }


 private static function get_title() {
  return 'Title';
 }
}

// OK - get_info() calls the private method get_title() inside the static class
echo MyStaticClass::get_info('title');

// ERROR - get_title() is private so cannot be called from outside the class
echo MyStaticClass::get_title();
2 голосов
/ 29 июля 2010

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

обновление у вас может быть приватная статическая функция - я не уверен, что ваш вопрос может быть связан с небольшим неправильным пониманием приватной и статической как взаимоисключающих концепций

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...