|
|
|
| Есть несколько директорий
в каждой находится:
класс контролера ( _Controller.php ) и файл с параметрами (_Config.php )
Параметры в файле
_Config.php
в виде ассоциативного массива
<?
return array('aaa=>xxx',
'bbb'=>'hhh',
'ccc'=>'vvv'
);
|
class A{ }
class Controller{ }
|
Как в класс А загрузить класс контроллер + с файлом своих параметров (файла конфигурации (_Config.php ) )
__autoload( ){ }
С условием ,если нет файла конфигурации (_Config.php ) в выбранной директории ,то в класс А подгрузить только класс контроллера в этой директории ( _Controller.php )
p.s Вроде сформулировал правильно
в итоге хочу получить эти (Параметры Выбранного контроллера) внутри класса контроллера | |
|
|
|
|
|
|
|
для: Косорылый
(03.02.2011 в 23:39)
| | А в чем сложность? Ведь файл можно подключить при помощи include()? | |
|
|
|
|
|
|
|
для: cheops
(03.02.2011 в 23:59)
| | Инклюдами я сделал
<?
class Router{
private $ArUrl;
private static $ConfigUrl;
function __construct($ArUrl){
$this->ArrayUrl = $ArUrl;
$this->ConfigUrl = '/_ConfigRoutes.php';
}
function Run(){
$Contr= count($this->ArrayUrl) ? array_shift($this->ArrayUrl) : 'main'; // Первый сегмент — контроллер.
$ContrConfParam = MODS.$Contr.$this->ConfigUrl; // Файл конфигурации контроллера модуля
$ContrFile= MODS.$Contr.'/_Controller.php'; // Файл контроллера модуля
# Подключаем файл конфигурации выбранного модуля
$InParametrs = is_file($ContrConfParam) ? require_once $ContrConfParam : $this->ErrHeader();
# Подключаем контролер выбранного модуля
is_file($ContrFile) ? include_once $ContrFile : $this->ErrHeader();
$Parametrs = $this->ArrayCombine($InParametrs, $this->ArrayUrl);// Ассоциативный массив с параметрами
if(!is_callable(array('Controller', 'HelloParametrs'))) $this->ErrHeader();
$Controller = new Controller($Parametrs);
$Controller->HelloParametrs();
}
}/* END class Router */
|
А как контролер и параметры грузить с помощью __autoload( )
p.s. В ООП я полный дуб , учусь :)) | |
|
|
|
|
|
|
|
для: Косорылый
(04.02.2011 в 10:20)
| | а что обязательно шаблон мвц должен быть реализован с применением ооп? | |
|
|
|
|
|
|
|
для: Красная_шляпа
(04.02.2011 в 11:07)
| | Конечно нет, просто решил некоторые скрипты на процедуре переработать на ООП , так для общего развития и понимания оного,для саморазвития :)))) | |
|
|
|
|
|
|
|
для: Косорылый
(05.02.2011 в 11:41)
| | Функция __autoload() (да и реализация ООП в PHP в целом, пожалуй) подразумевают, что у вас не должно быть в одном пространстве имен двух классов с идентичными именами.
Вообще, __autoload используется примерно так:
<?php
//Файл index.php:
new MyPackages_Router();
function __autoload($className)
{
$fileName = 'classes/'. str_replace('_', '/', $className) . '.php';
if(file_exists($fileName))
include_once($fileName);
}
//Файл classes/MyPackages/Router.php:
class MyPackages_Router
{
}
|
Распространенный вариант архитектуры - создать базовый класс контроллера с методом, подгружающим конфигурацию из нужного места, а все реальные контроллеры наследовать от него и вызывать в конструкторе этот метод. | |
|
|
|
|
|
|
|
для: The Electronic Cat
(05.02.2011 в 13:36)
| | Понятно ,спасибо и попутный вопрос про модификаторы доступа:
public
private
protected
Смысл ,для чего они нужны каждый, полностью понятен ,но не понятно в каких случаях (практически) какой использовать | |
|
|
|
|
|
|
|
для: Косорылый
(05.02.2011 в 14:34)
| | это от явы, в питоне их например нет, а в перле вообще нет классов.
<?php
error_reporting(E_ALL);
class Example {
public $foo = "foo";
private $bar = "bar";
}
echo "<pre>";
$obj = new Example();
$arr = (array) $obj;
echo print_r($arr, 1)."\r\n";
abstract class Parent {
public $a;
protected $b;
private $c;
}
class Child {
public function __construct($a, $b, $c) {
$this->a = $a;
$this->b = $b;
$this->c = $c;
}
}
$x = new Child("foo", 1, true);
?>
|
| |
|
|
|
|
|
|
|
для: Красная_шляпа
(05.02.2011 в 14:47)
| | Так человеку будет понятнее, ну и ошибки я ваши убрала:
<?php
error_reporting(E_ALL);
class Example {
public $foo = "foo";
private $bar = "bar";
}
echo "<pre>";
$obj = new Example();
//var_dump($obj);
print $obj->foo . "<br />";
// print $obj->bar . "<br />"; //Fatal error: Cannot access private property Example::$bar in ...
abstract class Parent1 { //нельзя класс называть Parent - зарезервированное слово
public $a;
protected $b;
private $c;
}
class Child extends Parent1 { //надо указать, что класс - наследник абстрактного
public function __construct($a, $b, $c) {
$this->a = $a;
$this->b = $b;
$this->c = $c;
}
}
$x = new Child("foo", 1, true);
// var_dump($x);
print $x->a . "<br />";
//print $x->b . "<br />"; //Fatal error: Cannot access protected property Child::$b
print $x->c . "<br />";
?>
|
| |
|
|
|
|
|
|
|
для: Лена
(05.02.2011 в 15:26)
| | там ошибок нет в первом примере я хотел обратить внимание что приватные свойства не доступны после преобразования объекта в массив то есть если по объекту пройтись форичем то выведутся только публичные свойства. Во втором ошибки и так будут выведены на экран и задача их разобрать. а нет есть я экстендс пропустил Бывает. | |
|
|
|
|
|
|
|
для: Косорылый
(05.02.2011 в 14:34)
| | Исхожу из того, что вы действительно знаете и понимаете, для чего нужен каждый.
Я еще не сталкивался с ситуацией, когда бы стоило применить private. Всегда ставлю protected - вдруг решу сделать наследников?
По поводу применения - это хорошо описано в одной из книг от Софттайма.
Допустим, у нас есть свойство "Возраст" ($age).
Так вот, если вы позволите получать свойство возраст напрямую (echo $obj->age), то через годик-два и более вы обнаружите, что человеку как было 20, так и осталось. Как бы этого не хотелось барышням, но увы.
Соответственно, придется редактировать возраст в соответствии с пройденным временем.
Вы создаете метод get_age(), который будет вносить эти корректировки, и ставите модификатор доступа на age как protected - теперь напрямую к нему обратиться нельзя и соответственно некорректной ситуации не получится.
P.S. Это только иллюстрация, на самом деле, лучше хранить дату рождения, а не возраст. | |
|
|
|