Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/35: Рейтинг темы: голосов - 35, средняя оценка - 4.63
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
1

Вызов метода одного класса через другой

30.05.2014, 18:07. Показов 6410. Ответов 12
Метки нет (Все метки)

Необходимо вызвать метод класса ч/з другой класс.
Методов класса много, сами классы тоже много. Поэтому делаю один класс, который будет обращаться к нужному классу по названию переменной.
Делаю так:
Вот класс, из которого должны вызываться методы других классов
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class MyClass
 {
    public $var;
  
    public function __set($name, $value) {
       $this->var[$name] = $value;
    }
    
    public function __get($name) {
        $file = 'model/'.$name.'.model.php';
        if (file_exists($file)) {
           $m = $name.'Model'; 
           //  return $this->var = new $m;
           $name =  new $m;
            return $this->var[$name];
        }
    }
}
а главном контроллере обращаюсь к классу MyClass
PHP
1
$m= new MyClass();
Теперь, в зависимости какое название я передам сюда
PHP
1
$m->name
должен подключаться тот или иной класс (получается $m->name - становится объектом подключенного класса).
А таким способом
PHP
1
$m->name->someMethod();
должен срабатывать тот или иной метод (в данном случае метод - someMethod() класса nameClass).

Не срабатывает. Можно ли так обращаться из класса в класс? Если да, как сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2014, 18:07
Ответы с готовыми решениями:

Вызов метода одного класса внутри другого класса
PHP передача метода, с класса, в другой класс Столкнулся с проблемой не могу передать метод или...

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

Вызов метода класса, по нажатию на submit
<? include("class/class.User.php"); ?> . . . <form method="POST" action="#"> ... ...

Вызов нестатического метода внутри класса
Здравствуйте! Подскажите пожалуйста, как вызвать внутри класса из одной функции - другую. Вот код:...

12
365 / 372 / 89
Регистрация: 01.12.2013
Сообщений: 1,629
30.05.2014, 21:09 2
Цитата Сообщение от __PION__ Посмотреть сообщение
$name = new $m; return $this->var[$name];
в методе get нет присвоения значения переменной $this->var[$name]. Это как одна из причин не срабатывания
0
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
30.05.2014, 21:20  [ТС] 3
Цитата Сообщение от ads Посмотреть сообщение
в методе get нет присвоения значения переменной $this->var[$name]. Это как одна из причин не срабатывания
писал и так
PHP
1
2
$this->var[$name] = new $m;
return $this->var[$name];
так ничего.
В главном контроллере здесь
PHP
1
$m= new MyClass();
вардамп объекта $m возвращает
Код
object(MyClass)#3 (1) { ["var"]=> NULL }
т.е, вот это не срабатывает $m->name.
Так
PHP
1
$m->name = 'value';
вроде в name попадет значение, но мне это не нужно. Я хочу чтобы $m->name содержал в себе объект подключаемого класса, имя которого состоит из name
0
562 / 339 / 87
Регистрация: 15.05.2013
Сообщений: 812
Записей в блоге: 1
30.05.2014, 22:04 4
Таким образом ничего не получится сделать. Конструкция вида
PHP
1
$obj->name->getAge();
Приведет к вызову __get() с одним единственным параметром - name; А зная один лишь этот параметр невозможно вызвать метод объекта. То есть, допустим, отрабатывает __set():
PHP
1
2
3
4
5
6
 public function __set($name, $value)
    {
        if (!isset($this->var[$name])) {
            $this->var[$name] = $value;
        }
    }
Если вызов был следующим:
PHP
1
$obj->name = new Class();
то в $obj->var[$name] хранится ссылка на объект. А теперь, если попытать вызвать метод этого объекта все также, через несуществующее свойство, получится что вызывается __get($param); Поскольку параметр всего один, и он состоит только из имени свойства, и имя метода в него не попадает, то можно лишь найти объект в $var[$name], но какой из его методов следует вызвать неизвестно.
PHP
1
2
3
4
5
6
public function __get($name)
    {
        if (isset($this->var[$name])) {
            return $this->var[$name]-> //А метод-то где? Параметр один у __get.
        }
    }
Было бы по-другому, если бы PHP не задумывался о том, что является именем свойства, а что следует из этого имени исключить, и передавал бы в __get() всю строку $obj->name->getAge();.

Как ни странно, но следующее работает ввиду динамических особенностей:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MyClass
{
   
}
 
class User
{
    public function getAge()
    {
        return 32;
    }
}
 
$obj = new MyClass();
$obj->name = new User();
echo $obj->name->getAge(); //32
Отсюда вывод - реализовать автозагрузку классов через __autoload или spl_autoload_register.
1
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
30.05.2014, 23:18  [ТС] 5
Цитата Сообщение от Forastero Посмотреть сообщение
Отсюда вывод - реализовать автозагрузку классов через __autoload или spl_autoload_register.
у меня (система) контроллеры так и работают. мне нужна такая реализация уже внутри контроллеров.
Такой вид
Цитата Сообщение от Forastero Посмотреть сообщение
$obj->name->getAge();
не принципиален.
Я просто не хочу все время писать
Цитата Сообщение от Forastero Посмотреть сообщение
$obj = new MyClass();
$obj->name = new User();
echo $obj->name->getAge();
.

Задача такая. Создать объект этого класса
PHP
1
$m= new MyClass();
, передать его в общий вид и использовать в нужном блоке. Я же не буду в виде создавать объект и это в каждом блоке.
А так, в виде будет жить объект класса MyClass, записав так $m->name - у меня будет объект уже нужного класса, а так - $m->name->someMethod(); - нужный метод в любом блоке.
Как же решить?
0
365 / 372 / 89
Регистрация: 01.12.2013
Сообщений: 1,629
31.05.2014, 14:15 6
для этого и существует ооп (без пехпешных извращений типа магических методов). Передаете в вид экземляр класса реализующий определенный интерфейс и усе.
0
562 / 339 / 87
Регистрация: 15.05.2013
Сообщений: 812
Записей в блоге: 1
01.06.2014, 10:22 7
ads, но ведь тогда получится, что вид, хоть и косвенным образом, выполняет то, что ему делать не положено.
Практически, задача контроллерра прекладывается на представление.
Или я вас не так понял?
0
365 / 372 / 89
Регистрация: 01.12.2013
Сообщений: 1,629
01.06.2014, 12:03 8
Цитата Сообщение от Forastero Посмотреть сообщение
Практически, задача контроллерра прекладывается на представление.
Или я вас не так понял?
Не могу знать как у вас организовано, но класс с методом getAge, по моему, это должна быть модель. Контроллер должен лишь взять нужный вид, создать экземпляр модели в зависимости от запроса, затем передать модель в вид. Вид в процессе отрисовки вызывает getAge переданного ей экземпляра модели.
как-то так в фреймворках организовано
0
562 / 339 / 87
Регистрация: 15.05.2013
Сообщений: 812
Записей в блоге: 1
01.06.2014, 12:46 9
ads, передача экземпляра модели в вид, имхо, нарушит концепцию MVC.
Контроллер должен взаимодействовать с моделью, а представление уже работает с конкретными данным.
Хотя, где-то я все же вычитал, что классическая парадигма MVC что-то подобное допускает. Одни делают контроллеры тонкими, другие наоборот - толстыми.

Залез на ту же википедию...
PHP
1
2
3
4
5
6
7
8
9
//...
$list = new Krugozor_Module_Advert_Service_List
        (
            $this->getRequest(), $this->getMapper('Advert/Advert'), new Krugozor_Pagination_Manager(10, 10, $this->getRequest())
        );
 
        $this->getView()->adverts    = $list->getList();
        $this->getView()->pagination = $list->getPagination();
//...
Или даже тот же Yii Framework взять...
PHP
1
2
3
4
return $this->render('view', [
            'post' => $post,
            'text' => $text,
        ]);
P.S. Кажется, пришло время прочесть что-то основательное по данной теме.
0
365 / 372 / 89
Регистрация: 01.12.2013
Сообщений: 1,629
01.06.2014, 14:59 10
Код первой попавшейся вьюхи в генерируемом проекте yii:
PHP
1
2
3
4
<?php
/* @var $this SiteController */
/* @var $model ContactForm */
/* @var $form CActiveForm */
имя переменной показывает ее положение в структуре mvc. дальнейшей код не смысла приводить - много букв. Но, как видим, во вьюху передается и экземпляр контроллера и экземпляр модели.
Цитата Сообщение от Forastero Посмотреть сообщение
передача экземпляра модели в вид, имхо, нарушит концепцию MVC.
это не догма, а руководство к действию(с)Ленин.
Цитата Сообщение от Forastero Посмотреть сообщение
P.S. Кажется, пришло время прочесть что-то основательное по данной теме.
читать не вредно
0
562 / 339 / 87
Регистрация: 15.05.2013
Сообщений: 812
Записей в блоге: 1
01.06.2014, 17:42 11
Цитата Сообщение от ads Посмотреть сообщение
это не догма, а руководство к действию(с)Ленин.
"Программист не должен следовать инструкциям, а делать так, как ему удобнее" - смысл большинства книг по проектированию.))

Кстати, может это актуально именно для моделей, работающих с формами?
0
365 / 372 / 89
Регистрация: 01.12.2013
Сообщений: 1,629
01.06.2014, 19:11 12
Цитата Сообщение от Forastero Посмотреть сообщение
Кстати, может это актуально именно для моделей, работающих с формами?
Ну а какая разница? вы передаете во вьюху модель как "черный ящик"(объект). Который все сделает в рамках именно модели, а не вида. Модель даст данные для вида каким-то методом (getAge продолжая тему).. Искренне не понимаю в чем передача объекта модели в вид противоречит MVC
0
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
01.06.2014, 20:35  [ТС] 13
Спасибо ребята, интересное обсуждение. А свою задачу решил
PHP
1
2
3
4
5
6
7
8
9
10
11
12
class Layout
{
    public function __get($name) {
        $layout_file = 'apps/'.$name.'/model/'.$name.'Layout_model.php';
        if (file_exists($layout_file))
        {
           $layoutClass = $name.'Layout_Model';
           $layout = new $layoutClass();
           return $layout; 
        }
    }
}
Класс, который вызываем (для примера), таких может быть много
PHP
1
2
3
4
5
6
7
8
9
10
class siteLayout_Model //extends site_Model
{
    public function getEvents() {
       echo 'Это метод <strong>getEvents</strong>';
    }
    
    public function __call($name, $arguments) {
       echo 'Метод <strong>'.$name.'</strong> отсутствует в классе <strong>'.__CLASS__.'</strong>';
    }
}
И обращение во вьюшке
PHP
1
$layout->site->getEvents();
$layout - объект класса Layout,
$layout->site - объект класса siteLayout_Model
getEvents() - метод в siteLayout_Model
Часть site меняется, и в зависимости от него вызывается та или иная модель.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2014, 20:35

Вызов статического метода класса в другом классе
Как вызвать статический метод из одного класса в другом? вот этот код не работает class A{...

Вызов метода класса из сторонней функции без объявления объекта
Собственно вопрос в топике. Можно? т.е. есть некий класс MyMySQLClass() в котором прописаны...

Как передать переменную с одного метода в другой
Есть у меня два метода, вот первый public function get_station_page($page) { ...

Как правильно описать метод внутри другого метода одного и того же класса?
Извияюсь за возможно глупый вопрос, но ООП тема для меня новая.Вот так выглядел метод класса в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru