Программирование классами

Netman

Новичок
Программирование классами

Добрый день, есть следующий вопрос.
Никогда не программировал классами, а тут решил попробовать. Столкнулся со следующе проблемой, как правильно передавать данные между классами.
К примеру есть класс конфигурации, обработки новостей и т.д. Переодически приходится в одном классе использовать несколько функций из других,
а как это делать правильно к сожалению не знаю :(

На данный момент делаю так, но что то у меня вызывает сомнения в правильности данного метода.
PHP:
class system_config {

   var work_mode = 1;
   var db_name = 'test_db_name';
   var db_password = '123';
   var db_login = 'root';

}

class print_class {

   function print_db_name($data){
      print $data;
   }
}

class test_class {

   function print_db_name(){
      global $SYSTEM_CONFIG,$PRINT_CLASS;
      $PRINT->print($SYSTEM_CONFIG->db_name);
   }
}

$SYSTEM_CONFIG = new system_config;

$PRINT_CLASS = new print_class;
$TEST_CLASS = new test_class;

$TEST_CLASS ->print_db_name();
 

x-yuri

Новичок
если ты просто хочешь попробовать "а как оно, использовать классы" - возьми какой-нибудь фреймворк соответствующий и попробуй
или определись, для чего тебе нужны классы
 

Netman

Новичок
Просто на данный момент в проекте есть порядка 10 классов, которые начинают сильно зависить друг от друга, что на мой взгляд не есть хорошо. Как я понимаю, одно из преимуществ классов, это возможность лёгкого переноса класса в другой проект.

Соответственно вопросик, какой лучше фреймворк посмотреть, то есть какой будет ,более показательным в качестве примера (более правильно написан с точки зрения работы с классами). На данный моментна на примете joomla 1.5?
 

HraKK

Мудак
Команда форума
это возможность лёгкого переноса класса в другой проект.
К сожалению, не всегда. Даже сам Фаулер признает что повторное использование зачастую - миф.

На данный моментна на примете joomla 1.5?
В глубокую ТОПКУ. Смотри ZF
 

HraKK

Мудак
Команда форума
pilot911
Исчезни, если ты так делаешь не надо другим советовать.
И вообще пиши без классов - классы это понижение производительности.
 

Духовность™

Продвинутый новичок
а смысл избавляться от глобал ? потому что так модно ?
Инкапсуляция — это принцип, согласно которому любой класс должен рассматриваться как чёрный ящик — пользователь класса должен видеть и использовать только интерфейсную часть класса (т. е. список декларируемых свойств и методов класса) и не вникать в его внутреннюю реализацию. Поэтому данные принято инкапсулировать в классе таким образом, чтобы доступ к ним по чтению или записи осуществлялся не напрямую, а с помощью методов. Принцип инкапсуляции (теоретически) позволяет минимизировать число связей между классами и, соответственно, упростить независимую реализацию и модификацию классов.

Используя global-сы мы привязываем класс к реализации, а не к интерфейсу. Это, в принципе, относится не только к классам, но и к функциям.
 

pilot911

Новичок
Автор оригинала: triumvirat
Инкапсуляция — это принцип, согласно которому любой класс должен рассматриваться как чёрный ящик — пользователь класса должен видеть и использовать только интерфейсную часть класса (т. е. список декларируемых свойств и методов класса) и не вникать в его внутреннюю реализацию. Поэтому данные принято инкапсулировать в классе таким образом, чтобы доступ к ним по чтению или записи осуществлялся не напрямую, а с помощью методов. Принцип инкапсуляции (теоретически) позволяет минимизировать число связей между классами и, соответственно, упростить независимую реализацию и модификацию классов.

Используя global-сы мы привязываем класс к реализации, а не к интерфейсу. Это, в принципе, относится не только к классам, но и к функциям.
да разве ? что такое интерфейсная часть - это функции и методы.. и глобалсы тут совершенно не при чем
 

john.brown

просто кулибин
pilot911
Да неужели?
А в этом куске кода тоже не при чем?
PHP:
class test_class {

   function print_db_name(){
      global $SYSTEM_CONFIG,$PRINT_CLASS;
      $PRINT->print($SYSTEM_CONFIG->db_name);
   }
}
К тому же глобалсы - это еще и замечательная возможность сотворить плохо вылавливаемые баги, и запутать код.
 

pilot911

Новичок
Автор оригинала: john.brown
pilot911
Да неужели?
А в этом куске кода тоже не при чем?
PHP:
class test_class {

   function print_db_name(){
      global $SYSTEM_CONFIG,$PRINT_CLASS;
      $PRINT->print($SYSTEM_CONFIG->db_name);
   }
}
К тому же глобалсы - это еще и замечательная возможность сотворить плохо вылавливаемые баги, и запутать код.
тут лучше писать по-другому:
PHP:
class test_class {

   function print_db_name(){
     $GLOBALS['PRINT']->print($GLOBALS['SYSTEM_CONFIG']->getDBName());
   }
}

по-моему, не менее красиво, чем с разными регистри и тп


ПС. баги с регистри ловятся абсолютно точно так же, как и с глобалсом
 

Духовность™

Продвинутый новичок
тривиальный пример. мы пишем якобы универсальный класс для чтения файлов. вариант с глобалсами:

PHP:
$DIR = $_SERVER['DOCUMENT_ROOT'].'/files/';
 
class getFile
{
     global $DIR;

     public function readFile($file)
     {
          echo file_get_contents($DIR.$file);
     }
}
вот тут класс уже не "чёрный ящик". Он завязан на реализации и что бы повторно использовать код мы должны объявить переменную $DIR вне класса, т.е. лезть в реализацию метода и смотреть, как нам передать в класс путь к директории с файлами. Инкапсуляция нарушена. Это уже не ООП.

Вот тот же класс, но когда "пользователь класса должен видеть и использовать только интерфейсную часть класса":

PHP:
class getFile
{
     private $DIR;

     public function setDir($dir)
     {
          $this->DIR = $dir;
     }

     public function readFile($file)
     {
          echo file_get_contents($this->DIR.$file);
     }
}
Всё. Теперь мы опрерируем не с реализацией класса, а с API. Нам нет необходимости знать, как реализован этот класс, у нас есть два метода setDir() и readFile(), которые позволяют использовать класс без знания того, как нужно объявлять глобпльные переменные:

PHP:
$c = new getFile();
$c->setDir('C:\WINDOWS\\');
$c->readFile('my.ini');
 

john.brown

просто кулибин
pilot911
Может все таки лучше как то так?
PHP:
class test_class {
	private $printer;
	
	private $testItem;
	
	function __construct(print_class $printer) {
		$this->printer = $printer;
	}
	function setTestItem($item) {
		$this->testItem = $item;
	}
	function printKey($key) {		
		$this->printer->print($this->testItem->{$key});
	}
}
$testClass = new test_class(new print_class());
$testClass->setTestItem(new system_config());
$testClass->printKey('db_name');
И никаких глобалс, и даже регистров... :)
 

pilot911

Новичок
Автор оригинала: john.brown
pilot911
Может все таки лучше как то так?
PHP:
class test_class {
	private $printer;
	
	private $testItem;
	
	function __construct(print_class $printer) {
		$this->printer = $printer;
	}
	function setTestItem($item) {
		$this->testItem = $item;
	}
	function printKey($key) {		
		$this->printer->print($this->testItem->{$key});
	}
}
$testClass = new test_class(new print_class());
$testClass->setTestItem(new system_config());
$testClass->printKey('db_name');
И никаких глобалс, и даже регистров... :)
Ну представь, какие накладные расходы на создание каждого объекта будут идти, если у тебя порядка 100-200 обращений к конфигурационным данным (и это только к конфигу). 100 раз создать объект... да весь скрипт хранить его в памяти... если хочется покруче напрячь сервак - то можно делать и так



Триумвират, глобалсы - это объекты или конфиги, которые завязаны на весь проект, когда с большой долей вероятности твои классы не будут использоваться кем-то другим, поэтому не вижу ничего ужасного, чтобы писать так:


PHP:
class getFile
{

     public function readFile($file)
     {
          echo $GLOBALS['debug'] ? file_get_contents($file) : ''; 
     }
}


$testClass = new getFile();
$testClass->readFile('полный путь к файлу');
 

john.brown

просто кулибин
pilot911
А что мешает для такого объекта, как конфиг пользовать синглтон? Или религия не позволяет?

PHP:
$testClass->setTestItem(system_config::instance());
 

pilot911

Новичок
Автор оригинала: john.brown
pilot911
А что мешает для такого объекта, как конфиг пользовать синглтон? Или религия не позволяет?

PHP:
$testClass->setTestItem(system_config::instance());
я просто не понимаю, зачем ?

у меня большая система, которая завязана на один конфиг.. в чем преимущество $testClass->setTestItem(system_config::instance()); в сравнении с обращением к конкретному индексу в $GLOBALS['debug'] ?
 

john.brown

просто кулибин
triumvirat, вроде, уже объяснял:
вот тут класс уже не "чёрный ящик". Он завязан на реализации и что бы повторно использовать код мы должны объявить переменную $DIR вне класса, т.е. лезть в реализацию метода и смотреть, как нам передать в класс путь к директории с файлами. Инкапсуляция нарушена. Это уже не ООП.
Скоко раз я матерился на таких любителей глобалсов, когда надо было что то менять в их коде... :)
 
Сверху