
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.82] |
![]() |
|
Сообщ.
#1
,
|
|
|
есть у меня вот такой код
(пробую вот рунтайм) ![]() ![]() function Button1Click($sender, $params) { global $B; $B=new Memo; $B->show(); } function Button3Click($sender, $params) { var_dump($B); } } global $application; global $B; global $Page11 Мемо создается, НО.... переменная $B из кода ![]() ![]() function Button3Click($sender, $params) { var_dump($B); } пустая, хоть и описана как глобал, я что то не так делаю ? ) |
Сообщ.
#2
,
|
|
|
Каждый раз в функции надо добавлять global $B; чтобы она ее видела. ( в самом начале перед первым использованием в теле функции)
|
Сообщ.
#3
,
|
|
|
Цитата Alex2011 @ Каждый раз в функции надо добавлять global $B; чтобы она ее видела. ( в самом начале перед первым использованием в теле функции) Спасибо |
Сообщ.
#4
,
|
|
|
Цитата Serafim @ Цитата ssaich @ global Предлагаю нафиг закрыть и сжечь этот раздел ![]() ![]() а на этом форуме есть возможность бана флудеров,троллей и т.д. |
![]() |
Сообщ.
#5
,
|
|
Цитата Eremeev @ а на этом форуме есть возможность бана флудеров,троллей и т.д. Есть. Правда тебе осталось доказать, что тех людей, кто использует глобалсы не стоит отгорожать от сообщества разумных людей. ![]() |
![]() |
Сообщ.
#6
,
|
|
Цитата Eremeev @ а на этом форуме есть возможность бана флудеров,троллей и т.д. дадим ему ещё шанс, хотя все признаки на лицо ![]() |
![]() |
Сообщ.
#7
,
|
|
Я просто слишком насмотрелся на такой код в исходниках нашего форума, что бы просто так пройти мимо и не намекнуть на то, что писать такой код ни в коем случае нельзя. Для получения более подробной информации о качестве кода можно воспользоваться, например этим https://scrutinizer-ci.com/ или похожей поделкой от сенсиолабс https://insight.sensiolabs.com/
Примеры работы обоих инструментов (мои опенсорсные проекты), с позволения г-на vicis тут: SensioLabs Insight и Scrutinizer Coninuous Integration. Да, я приверженец идеального кода, т.к. исправление и поддержка совсем уж стрёмного потом обходится значительно дороже, как в плане денежной стоимости, так и в плане временных рамок - уже не раз сталкивался с подобными ситуациями. Если мои комментарии похожи на троллинг - прошу простить, но меня откровенно возмущает помощь по таким вопросам без замечания "я тебе помогу, но это плохой код" ![]() Добавлено В любом случае, что бы не быть голословным: исходный код Цитата function Button1Click($sender, $params) { global $B; $B=new Memo; $B->show(); } function Button3Click($sender, $params) { var_dump($B); } } global $application; global $B; global $Page11 1) Использовать global крайне нежелательно. 2) В методах Button3*** отсутствует упоминание видимости переменной, что противоречит стандартам Zend и PSR. Стандарт PEAR уже давно признан недееспособным. 3) Переменные ($B) пишутся в $camelCase, начиная с маленькой буквы: http://www.php-fig.org/psr/psr-1/ п.4.2. 4) Названия методов пишутся в camelCase: http://www.php-fig.org/psr/psr-1/ п.4.3. 5) Отсутствие отступов внутри методов. Внутри методов должен быть отступ в 4 пробела: http://www.php-fig.org/psr/psr-2/ п.2.4. (за исключением стандарта Wordpress, где рекомендуется использовать табы) ![]() |
Сообщ.
#8
,
|
|
|
Цитата Если мои комментарии похожи на троллинг - прошу простить, но меня откровенно возмущает помощь по таким вопросам без замечания "я тебе помогу, но это плохой код" плохой код или плохое оформление кода? если кто то учится пхп, то уж не в первую очередь оформлению кода, а самим основам. а желание оформить потом само придет. мог бы и знать такие вещи, а не требовать закрытий топиков |
![]() |
Сообщ.
#9
,
|
|
Цитата Eremeev @ плохой код или плохое оформление кода? если кто то учится пхп, то уж не в первую очередь оформлению кода, а самим основам. а желание оформить потом само придет. мог бы и знать такие вещи, а не требовать закрытий топиков И то и другое. Я списочек специально написал ![]() Добавлено Но если на код стайл ещё пофигу, то ещё в сообщении #6 я обосновал причину такой своей бурной реакции. Т.к. даже новички (тем более новички) и слышать не должны о наличии такой конструкции в языке, как глобалс. ![]() |
Сообщ.
#10
,
|
|
|
Цитата Т.к. даже новички (тем более новички) и слышать не должны о наличии такой конструкции в языке, как глобалс вот они и не зная потом и задают такие вопросы, раз не должны знать. покажи мне как в этом коде обойтись без глобал. ![]() ![]() function curr_day_ButtonClick($sender, $params) { global $Service_DB ; $Service_DB->select_catalog_product_curr_day(date('Y-m-d'),date('Y-m-d') , $_SESSION['id_f'], $_SESSION['id_app']); } ты еще про goto как то забыл упомянуть. |
![]() |
Сообщ.
#11
,
|
|
Цитата Eremeev @ ты еще про goto как то забыл упомянуть. Ну это само собой, я по этому случаю даже картиночку припрятал ![]() Прикреплённый файл ![]() Цитата Eremeev @ покажи мне как в этом коде обойтись без глобал. Ну чтож... Тупо статик: ![]() ![]() class ServiceDB { public static function select_catalog_product_curr_day() { // **** } } .... public function curr_day_ButtonClick() { ServiceDb::select_catalog_product_cur... } Singleton: ![]() ![]() class ServiceDB { private static $instance = null; public static function getInstance() { if (static::$instance === null) { static::$instance = new static; } return static::$instance; } private function __construct() {} } ServiceDb::getInstance()->select... UPD: Скрыл лишнее, чтоб не портить психику Ещё Немного примеров как обойтись без глобалов Registry и Ioc: ![]() ![]() class Registry extends ArrayAccess { // переписывать всю реализацию ArrayAccess - лень, так что опускаю её protected static $facadeInstance = null; public static function get($alias) { return static::$facadeInstance[$alias]; } public static function resolve($alias, callable $instance) { return static::$facadeInstance[$alias] = $instance(static::$facadeInstance); } public static function setFacade(Registry $self) { static::$facadeInstance = $self; } } Registry::setFacade(new Registry); Registry::resolve('service', function(){ return new ServiceDb; }); Registry::get('service')->select_catalog_product.... Dependency Injection: ![]() ![]() DiContainer::resolve(function(){ return new ServiceDb; }); DiContainer::inject(Класс_с_методом_curr_day_ButtonClick::class); .... public function curr_day_ButtonClick(ServiceDb $db) { $db->select_catalog_..... } Dependency Injection на аннотациях: ![]() ![]() DiContainer::resolve(function(){ return new ServiceDb; }); DiContainer::inject(Класс_с_методом_curr_day_ButtonClick::class); /** * @DiContainer\Inject(db = "ServiceDb") */ public function curr_day_ButtonClick($db) { $db->select_catalog_..... } Наследование: ![]() ![]() abstract class AbstractApplicationRegistry { protected static $container = []; public static remember($alias, $value) { static::container[$alias] = $value; } public function __get($name) { return isset(static::$container[$name]) ? static::$container[$name] : null; // В PHP 7.0: return static::$container[$name] ?? null; } } class Some extends AbstractApplicationRegistry { public function curr_day_ButtonClick($db) { $this->serviceDb->select_catalog_..... } } Трейты: ![]() ![]() trait ApplicationRegistry { protected static $container = []; public static remember($alias, $value) { static::container[$alias] = $value; } public function __get($name) { return isset(static::$container[$name]) ? static::$container[$name] : null; // В PHP 7.0: return static::$container[$name] ?? null; } } class Some { use ApplicationRegistry; public function curr_day_ButtonClick($db) { $this->serviceDb->select_catalog_..... } } Добавлено О, ещё аннотациями можно: ![]() ![]() /** * @Annotation * @Target("CLASS") */ class Container { private $container = []; public function __construct(array $values) { $this->container = $values; } public function apply(ReflectionClass $context) { // тут выбираем нужные значения из общего контейнера данных и отправляем их в $context } } /** * @Container(serviceDb = ServiceDb::class) */ class Some { public function curr_day_ButtonClick($db) { $this->serviceDb->select_catalog_..... } } Добавлено Плюс Композицию, как альтернативу наследованию никто не отменял ![]() Добавлено А ещё можно на этапе автолоада классов, через рефлексию внедрять объект контейнера с инстансами... Добавлено А ещё можно хранить это всё в одном классе и вытаскивать через объект замыкания (Closure) с переносом контекста (bind или bindTo). Это кстати дико магический способ - я уже приводил в пример динамическое наследование, примерно так же и сделать: Нужен пример неизменяемого класса и класса от которого нельзя наследоваться Добавлено А ещё можно назначить свой поток (функция stream_wrapper_register), например "inject://" (как это сделано у меня https://github.com/SerafimArts/Mirror/blob/...ader/Filter.php) и подменять реализацию классов вообще как угодно, делая с ними всё что угодно. Правда там токенизер нужен будет и лексер... И вообще это изврат. Добавлено Ну что, ещё? ![]() Добавлено Цитата Serafim @ Dependency Injection: есть кстати очень крутая либа для этого: http://php-di.org/ |