[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: подключение классов и их инициализация
m4a1fox
Всем доброго времени суток. Стало интересно решение такой вот задачки... Сразу оговорюсь, много запутанно. Так что если что уточняйте :)
Итак имеем вот такой класс
Файл 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{
public $load = new Load();
...

}

И по аналогии.

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

А у меня Parse error: syntax error, unexpected T_NEW
Так вроде нельзя

Спустя 3 минуты, 17 секунд (13.03.2012 - 15:11) sharki написал(а):
ADiel
Ну так пусть человек проследит за расположением классов) И пропишет автолоадеры


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
Вот теперь я вообще в тупике. Спасибо, вот так сделал

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 забыл

Спустя 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.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.