2016-03-23 5 views
0

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

class Site { 
    var $message; 

    public function setMessage($string) { 
     $this->message .= $string; 
    } 

    public function outputMessage($string) { 
     echo $this->message; 
    } 

} 

И мой другой класс

class Company { 
    var $name; 

    public function setName($string) { 
     $this->name.= $string; 

     // TESTING HERE 
     Site::setMessage("Company Set: " .$string); 
    } 
} 

Тогда у меня есть главная страница

$Site = new Site(); 
$Site->addMessage("Start"); 

$Company = new Company(); 
$Company->addName('Company X'); 

$Site->outputMessage(); 

Я пытаюсь получить мой экран, чтобы сказать "Пуск компании Set: Компания X". Таким образом, сайт может хранить любые сообщения, которые должен хранить любой класс.

Я попытался превратить функцию в статическую без везения. Независимо от того, что я пытаюсь, я получаю какую-то ошибку.

Для примера:
Фатальная ошибка: Доступ к необъявленной статического свойства: Компания :: $ имя

Фатальная ошибка: Использование $ это, когда не в контексте объекта

Может кто-нибудь мне точку в правильном направлении ?

+0

Прежде всего - в классе 'Site' нет метода' addMessage'. Как 'addName' в' Company'. Второй - как метод, называемый статически - нет 'this', –

+0

Если вы хотите вызвать метод из другого класса, вам нужно включить этот класс, прежде чем пытаться его вызвать. Кроме того, убедитесь, что метод, который вы вызываете, является 'public'. – aphextwix

+0

К сожалению, это должно быть setMessage. Я редактировал вопрос, чтобы показать правильную функцию. Я попытался изменить setCompany на статическую функцию и использовать Адрес :: company = $ string; Но я получаю еще одну ошибку: Неустранимая ошибка: доступ к необъявленному статическому свойству: Company :: $ name. Также в настоящее время эти классы находятся в одном файле. Я не думаю, что мне нужно что-то включить. – user1860996

ответ

0

Несмотря на мое резервирование этой модели, вы действительно хотите Site класса быть синглтоном:

class Site { 
    private static $instance = new Site(); 

    public static getInstance() { 
     return Site::$instance; 
    } 

    private $message; 

    private function __construct() { 

    } 

    public function addMessage($message) { 
     $this->message .= $message; 
    } 

    public static function addNewMessage($message) { 
     $instance->addMessage($message); 
    } 
} 

Теперь вы можете использовать Site::addNewMessage('...') или получить доступ к экземпляру Site через Site::getInstance().

+0

'private function __construct' –

+0

@u_mulder: Спасибо, что поймали это. Я всегда виняю конструкторы в PHP. –

+0

Спасибо, что пытались мне помочь. Очень ценится. Тем не менее, я получаю сообщение об ошибке в первой строке внутри класса. Ошибка анализа: синтаксическая ошибка, неожиданное «новое» (T_NEW) – user1860996

0

В итоге я передал класс другому. Я не мог заставить это работать. Если у кого-то есть другой способ, пожалуйста, дайте мне знать. Еще раз спасибо.

class Company { 
    private $Site; 
    var $name; 

    function __construct(Site $Site) { 
     $this->Site = $Site; 
    } 

    public function addMessage ($string) { 
     $this->Site->addMessage($string); 
    } 

    public function setName($string) { 
     $this->name.= $string; 

     // TESTING HERE 
     $this->Site->addMessage($string); 
    } 
} 

$Site = new Site(); 
$Site->addMessage("Start"); 

$Company = new Company($Site); 
$Company->addName('Company X'); 

$Site->outputMessage(); 
Смежные вопросы