[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Классы и глобальные переменные
Страницы: 1, 2, 3
SlavaFr
@Ranerg не в коем случае не пользуйся global в классах, и не когда не советуй это другим.
Имеется только один способ передачи переменныг в клаасс, это посредством set-функций или конструктора.

_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
Ranerg
Цитата (SlavaFr @ 3.01.2013 - 16:36)
@Ranerg не в коем случае не пользуйся global в классах, и не когда не советуй это другим.
Имеется только один способ передачи переменныг в клаасс, это посредством set-функций или конструктора.

Меня не устраивает такие конструкции как:


$database = new Database("some arguments");
$cookie = new Cookie("some arguments");
$session = new Session("some arguments");

$engine = new Engine($database, $cookie, $session);
$user = new User($database, $cookie, $session);


Но мне бы хотелось, чтобы ты привел аргументы для того, чтобы я принял твою строну:)
Приведи минусы моего подхода и плюсы твоего совета:)
kaww
Ranerg, определите реестр в который и будете хранить "глобальные" объекты
Registry::set('db', new Database("some arguments"));
//some code
$db = Registry::get('db');
Ranerg
Цитата (kaww @ 3.01.2013 - 16:52)
Ranerg, определите реестр в который и будете хранить "глобальные" объекты
Registry::set('db', new Database("some arguments"));
//some code
$db = Registry::get('db');

И этот реестр я должен передывать в качестве аргумента?
Я не такой опытный в этом языке и хотелось бы узнать по подробней:)
kaww
Цитата
И этот реестр я должен передывать в качестве аргумента?

нет, не должны. Класс содержит 2 статичных метода get и set и соответственно доступны в любом месте
Ranerg
Цитата (kaww @ 3.01.2013 - 17:03)
Цитата
И этот реестр я должен передывать в качестве аргумента?

нет, не должны. Класс содержит 2 статичных метода get и set и соответственно доступны в любом месте

А мне нравится твое решение, создать реестр, который будет посредником между классом и глобальной областью.
$database = new DB();
Registry::set('db', $database);

class Example {
public $database;

public function __construct(){
$database = Registry::get('db');
}

public function print_test(){
echo $this->database->query('SELECT * FROM tbl');
}
}


Я так тебя понял?:)
kaww
Ranerg, да, именно так
Ranerg
kaww, спасибо:) Попытаюсь реализовать:)
SlavaFr
1) Создается зависимость Класса от глобальной переменной о которой пользовател класса не подразумевает и подразумевать не должен. Не одно IDE не подскажет тебе, что для работы класса требуется инициализация какойто глобальной переменной. Нет возможности изменить эту переменну обычными методами класса изменяа таким образом его поведение. Нет возможности на прямую применять класс в других проэктах, так как нужно за собой тянуть неуместную глобальную переменную.

2) случайная декларация переменной в глобальной области с таким же названием, или инициализация переменной не подходящим содержимым, или еще хуже измененние этой переменной из какойто другой функции сводило с ума при поиски ошибки многих программистов. Хочеш вызвать алергическую реакцию в команде, то используй globals

3)
Цитата (Ranerg @ 3.01.2013 - 12:47)
Меня не устраивает такие конструкции как:...

Тогда пользуйся Dependency injection Container или в конечном итоге просто напиши классы, которые только и занимаются инициализацией обькетов.





_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
kaww
Ranerg, вот в общих чертах:
class Registry {

protected static $_instance;

public $registry = array();

private function __construct(){}

private function __clone(){}

private function __wakeup(){}

public static function getInstance()
{
if (self::$_instance === null) {

self::$_instance = new Registry();
}
return self::$_instance;
}

public static function get($key)
{
$instance = self::getInstance();
if (!isset($instance->registry[$key])) {

throw new Exception('No entry is registered for key \'' . $key . '\'');
}
return $instance->registry[$key];
}

public static function set($key, $value)
{
self::getInstance()->registry[$key] = $value;
}

public static function isRegistered($key)
{
return isset(self::getInstance()->registry[$key]);
}
}
Быстрый ответ:

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