Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Загрузка классов с конфигурацией
 
 автор: Косорылый   (03.02.2011 в 23:39)   письмо автору
 
 

Есть несколько директорий
в каждой находится:
класс контролера ( _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 Вроде сформулировал правильно
в итоге хочу получить эти (Параметры Выбранного контроллера) внутри класса контроллера

  Ответить  
 
 автор: cheops   (03.02.2011 в 23:59)   письмо автору
 
   для: Косорылый   (03.02.2011 в 23:39)
 

А в чем сложность? Ведь файл можно подключить при помощи include()?

  Ответить  
 
 автор: Косорылый   (04.02.2011 в 10:20)   письмо автору
 
   для: 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(){
        
$Contrcount($this->ArrayUrl) ? array_shift($this->ArrayUrl) : 'main'// Первый сегмент — контроллер.
        
$ContrConfParam MODS.$Contr.$this->ConfigUrl;        // Файл конфигурации контроллера модуля
        
$ContrFileMODS.$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 в 11:07)   письмо автору
 
   для: Косорылый   (04.02.2011 в 10:20)
 

а что обязательно шаблон мвц должен быть реализован с применением ооп?

  Ответить  
 
 автор: Косорылый   (05.02.2011 в 11:41)   письмо автору
 
   для: Красная_шляпа   (04.02.2011 в 11:07)
 

Конечно нет, просто решил некоторые скрипты на процедуре переработать на ООП , так для общего развития и понимания оного,для саморазвития :))))

  Ответить  
 
 автор: The Electronic Cat   (05.02.2011 в 13:36)   письмо автору
 
   для: Косорылый   (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
{

}



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

  Ответить  
 
 автор: Косорылый   (05.02.2011 в 14:34)   письмо автору
 
   для: The Electronic Cat   (05.02.2011 в 13:36)
 

Понятно ,спасибо и попутный вопрос про модификаторы доступа:
public
private
protected

Смысл ,для чего они нужны каждый, полностью понятен ,но не понятно в каких случаях (практически) какой использовать

  Ответить  
 
 автор: Красная_шляпа   (05.02.2011 в 14:47)   письмо автору
 
   для: Косорылый   (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($arr1)."\r\n";

abstract class 
Parent {
    public 
$a;
    protected 
$b;
    private 
$c;
}

class 
Child {
    public function 
__construct($a$b$c) {
        
$this->$a;
        
$this->$b;
        
$this->$c;
    }
}

$x = new Child("foo"1true);

?>

  Ответить  
 
 автор: Лена   (05.02.2011 в 15:26)   письмо автору
 
   для: Красная_шляпа   (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;
        
$this->$b;
        
$this->$c;
    }
}

$x = new Child("foo"1true);
 
// var_dump($x);

print  $x->a  "<br />";
//print  $x->b  . "<br />"; //Fatal error:  Cannot access protected property Child::$b
print  $x->"<br />";

?>

  Ответить  
 
 автор: Красная_шляпа   (05.02.2011 в 16:46)   письмо автору
 
   для: Лена   (05.02.2011 в 15:26)
 

там ошибок нет в первом примере я хотел обратить внимание что приватные свойства не доступны после преобразования объекта в массив то есть если по объекту пройтись форичем то выведутся только публичные свойства. Во втором ошибки и так будут выведены на экран и задача их разобрать. а нет есть я экстендс пропустил Бывает.

  Ответить  
 
 автор: neadekvat   (05.02.2011 в 16:00)   письмо автору
 
   для: Косорылый   (05.02.2011 в 14:34)
 

Исхожу из того, что вы действительно знаете и понимаете, для чего нужен каждый.

Я еще не сталкивался с ситуацией, когда бы стоило применить private. Всегда ставлю protected - вдруг решу сделать наследников?

По поводу применения - это хорошо описано в одной из книг от Софттайма.
Допустим, у нас есть свойство "Возраст" ($age).
Так вот, если вы позволите получать свойство возраст напрямую (echo $obj->age), то через годик-два и более вы обнаружите, что человеку как было 20, так и осталось. Как бы этого не хотелось барышням, но увы.
Соответственно, придется редактировать возраст в соответствии с пройденным временем.
Вы создаете метод get_age(), который будет вносить эти корректировки, и ставите модификатор доступа на age как protected - теперь напрямую к нему обратиться нельзя и соответственно некорректной ситуации не получится.

P.S. Это только иллюстрация, на самом деле, лучше хранить дату рождения, а не возраст.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования