Итак имеем вот такой класс
Файл index.php
class Index extends Controller{
function index(){
$this->model("math");
$this->math->create();
}
}
Имеем файл-наследник - Controller.
class Controller{
function model($name){
$file = './models/' . $name . '.php';
if(file_exists($file)){
require './models/' . $name . '.php';
return $this->$name = new $name();
}
}
------------------
Что хочется попробовать реализовать
Сделать некий класс Load()
В классе Load реализовать метод model(). А вызывать его через класс Controller(), по сво-ву load.
Т.е. что бы в первом коде, вызов метода осуществлялся так -
function index(){
$this->load->model("math");
$this->math->create();
}
не могу придумать схему передачи... все время выпадает ошибка
Notice: Undefined property: Index::$math in Y:\home\phenix.com\www\controllers\index.php on line 11
-------------------------------------
Fatal error: Call to a member function create() on a non-object in Y:\home\phenix.com\www\controllers\index.php on line 11
Что получается... класс считает math сво-вом хотя на самом деле это класс... и еще, дело в том, что первый код этого топика, воспринимает math как класс, и вызывает его свойства нормально.
Конечно, можно сделать и так
function index(){
$this->math = $this->load->model("math");
$this->math->create();
}
И тогда нормально все работает... но хочется именно понять почему (точнее как) правильно передавать и инициализировать класс...
function index(){
$this->load->model("math");
$this->math->create();
}
И еще :) метод model() в классе Load() точно такой же как и в классе Controller.
Что я пытался сделать? Я думал передать ссылку на класс Load() в свойствере конструктора класса Controller и тогда при его применении в классе Index оно будет доступно. Т.е. я сделал так
class Controller{
public function __construct(){
$this->load = new Load();
}
Свойство, по правде говоря - срабатывает, возвращая объект класса что я передаю $this->load->model("math") вернет Math Object ( )... в общем так... но дальше я с ним работать не могу. Было бы верно заметить, что код $this->model("math"); так же возвращает Math Object ( ), и с ним я могу работать, т.е. использовать его метода так $this->math->create();
Спустя 12 минут, 42 секунды (13.03.2012 - 15:02) sharki написал(а):
m4a1fox
В контроллере ты объявляешь поля, одновременно присваивая экземпляры нужных тебе классов т.е
И по аналогии.
Получается некая внятная композиция, ведь ты можешь реализовать фабрику из контроллеров
В контроллере ты объявляешь поля, одновременно присваивая экземпляры нужных тебе классов т.е
class Controller{
public $load = new Load();
...
}
И по аналогии.
Получается некая внятная композиция, ведь ты можешь реализовать фабрику из контроллеров
Спустя 4 минуты, 11 секунд (13.03.2012 - 15:06) ADiel написал(а):
<?php
class ModelTest {
protected $data;
public function __construct($data) {
$this->data = $data;
}
public function test(){
return $this->data;
}
}
class SimpleModel {
private static $model;
public static function init($classname){
self::$model = new $classname('test');
}
public static function model(){
return self::$model;
}
}
SimpleModel::init('ModelTest');
echo SimpleModel::model()->test();
Если, конечно, правильно понял.
inlude можно не использовать, т.к. есть __autoload()
Спустя 2 минуты, 19 секунд (13.03.2012 - 15:08) ADiel написал(а):
Цитата (sharki @ 13.03.2012 - 12:02) |
m4a1fox В контроллере ты объявляешь поля, одновременно присваивая экземпляры нужных тебе классов т.е class Controller{ И по аналогии. Получается некая внятная композиция, ведь ты можешь реализовать фабрику из контроллеров |
А у меня Parse error: syntax error, unexpected T_NEW
Так вроде нельзя
Спустя 3 минуты, 17 секунд (13.03.2012 - 15:11) sharki написал(а):
ADiel
Ну так пусть человек проследит за расположением классов) И пропишет автолоадеры
PS.
Или в PHP так нельзя? (так можно в JAVA)
Ну так пусть человек проследит за расположением классов) И пропишет автолоадеры
PS.
Или в PHP так нельзя? (так можно в JAVA)
Спустя 1 минута, 2 секунды (13.03.2012 - 15:12) m4a1fox написал(а):
sharki
Цитата |
class Controller{ public function __construct(){ $this->load = new Load(); } |
Там и так это делает... собственно пичалько походу из-за вот этого.
Спустя 38 секунд (13.03.2012 - 15:13) alexbel2404 написал(а):
в конструкторе тогда создавать экземпляр класса)
Спустя 15 секунд (13.03.2012 - 15:13) m4a1fox написал(а):
sharki
Цитата |
Или в PHP так нельзя? |
public в конструкторе контроллера нельзя - ошибка однако это.
Спустя 7 секунд (13.03.2012 - 15:13) ADiel написал(а):
Notice: Undefined property: Index::$math
Нужно реализовать функции __set, __isset, __unset, __get в классе Index
Спустя 56 секунд (13.03.2012 - 15:14) m4a1fox написал(а):
alexbel2404
Цитата |
в конструкторе тогда создавать экземпляр класса) |
Первый вопрос... в каком конструкторе. Второй, если в контроллере то он и так там создается
Цитата |
class Controller{ public function __construct(){ $this->load = new Load(); } |
Спустя 58 секунд (13.03.2012 - 15:15) m4a1fox написал(а):
ADiel
Цитата |
Нужно реализовать функции __set, __isset, __unset, __get в классе Index |
Хм... о них я как то и не подумал. Тогда встречный вопрос. Реализовывать все, или только set и get?
Спустя 2 минуты, 51 секунда (13.03.2012 - 15:18) ADiel написал(а):
<?php
class Test {
private $data = array();
public function __isset($name){
return isset($this->data[$name]);
}
public function __set($name, $value) {
$this->data[$name] = $value;
return true;
}
public function __get($name) {
return isset($this->data[$name]) ? $this->data[$name] : false;
}
}
$test = new Test();
$test->var = 'testvar';
echo $test->var;
Только я не помню, что будет в name когда запросишь $test->var->foo();
Спустя 1 минута, 16 секунд (13.03.2012 - 15:19) m4a1fox написал(а):
ADiel
Вот теперь я вообще в тупике. Спасибо, вот так сделал
в классе Controller и все заработало.
Вот теперь я вообще в тупике. Спасибо, вот так сделал
function __get($name){
return new $name();
}
в классе Controller и все заработало.
Спустя 1 минута, 1 секунда (13.03.2012 - 15:20) ADiel написал(а):
$test = new Test();
$test->var = new Test();
$test->var->name = 'good';
echo $test->var->name;
Вроде работает
Спустя 59 секунд (13.03.2012 - 15:21) ADiel написал(а):
return new $name(); - каждый раз будет возвращаться новый экземпляр объекта, а не ранее созданный. Тогда зачем оно нужно?
Спустя 2 минуты, 9 секунд (13.03.2012 - 15:24) m4a1fox написал(а):
ADiel
Цитата |
return new $name(); - каждый раз будет возвращаться новый экземпляр объекта, а не ранее созданный. Тогда зачем оно нужно? |
А как тогда поступить?
Спустя 1 минута, 58 секунд (13.03.2012 - 15:26) ADiel написал(а):
Посмотри мой код с сеттерами и геттерами.
Ты создаешь объект только в момент присваивания, точнее присваиваешь уже экземпляр класса, а потом хранишь в массиве.
__get отдает ранее созданный объект из массива
Кстати, еще __unset забыл
Ты создаешь объект только в момент присваивания, точнее присваиваешь уже экземпляр класса, а потом хранишь в массиве.
__get отдает ранее созданный объект из массива
Кстати, еще __unset забыл
Спустя 3 минуты, 32 секунды (13.03.2012 - 15:29) m4a1fox написал(а):
ADiel
Да да я увидел... но тут получается вот такая ошибка
Да да я увидел... но тут получается вот такая ошибка
Цитата |
Call to a member function create() on a non-object |
\Метод вне объекта выскакивает
Спустя 1 минута, 54 секунды (13.03.2012 - 15:31) ADiel написал(а):
<?php
class Kernel {
private $modules = array();
public function __isset($name){
return isset($this->modules[$name]);
}
public function __set($name, $value) {
$this->modules[$name] = $value;
return true;
}
public function __get($name) {
return isset($this->modules[$name]) ? $this->modules[$name] : false;
}
}
class Module {
public function create(){
return "created";
}
}
$kernel = new Kernel();
$kernel->testmodule = new Module();
echo $kernel->testmodule->create();
#выводит created
Спустя 4 минуты, 27 секунд (13.03.2012 - 15:35) ADiel написал(а):
Вот только что бы из модуля получить доступ к ядру, я бы использовал статические функции и переменные
Спустя 7 минут, 55 секунд (13.03.2012 - 15:43) m4a1fox написал(а):
Спасибо ADiel. Очень помогли. Но пожалуй остановлюсь пока что на варианте с return new $name.