Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для rodigy
90 / 40 / 17
Регистрация: 24.10.2015
Сообщений: 577

Неймспейс задать константой

19.07.2017, 23:03. Показов 2255. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Можно ли задать namespaсe константой?
Типа этого:
PHP
1
2
namespaсe SomeConstant; // вместо константы будет ее значение
// declaring class/function etc.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.07.2017, 23:03
Ответы с готовыми решениями:

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

Проблема с константой!
Помогите додумать код,чтоб не было ошибки. #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv) { ...

Возврат по константой ссылке
Всем добрый день! И снова я с глупыми вопросами, простите заранее :-const int& mysum(int& num, int incr = 0) { num += incr;...

22
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
25.07.2017, 23:08
Лучший ответ Сообщение было отмечено rodigy как решение

Решение

Студворк — интернет-сервис помощи студентам
ВНИМАНИЕ, НЕ ПОВТОРЯТЬ, ОПАСНО !!!
Если за этот код уволят по статье неполное служебное соответствие, то я не виноват
я предупреждал
index.php
PHP
1
2
3
4
5
<?php
define('NS', 'Test');
include 'file1.php';
$name = NS.'\Test';
$obj = new $name();
file1.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
 
$matches = array();
$code = file_get_contents(__FILE__);
if (!preg_match('/\/\/ begin(.*)\/\/ end/s', file_get_contents(__FILE__), $matches)) {
    throw new \Exception(sprintf('code not found in file "%s". contents: %s', __FILE__, $code));
}
eval('namespace '.NS.";\n".$matches[1]);
 
if (false) {
    // begin
    class Test {
        public function __construct()
        {
            var_dump(__NAMESPACE__, self::class);
        }
    }
    // end
}
0
 Аватар для rodigy
90 / 40 / 17
Регистрация: 24.10.2015
Сообщений: 577
26.07.2017, 00:25  [ТС]
Jewbacabra, жесть, а у меня ведь почти получалось, тоже подумывал об использовать file_get_contents
0
123 / 77 / 33
Регистрация: 05.03.2013
Сообщений: 449
29.07.2017, 19:10
Лучший ответ Сообщение было отмечено rodigy как решение

Решение

rodigy, вот более-мение продуктовый код:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
spl_autoload_register(function($className) {
    $ds = DIRECTORY_SEPARATOR;
    $constName = 'MY_SUPER_CONST';
    
    $classPath = $ds . str_replace('\\', $ds, $className).'.php';
    
    if (defined($constName)) {
        $constValue = constant($constName);
        $classPath = 'classes' . preg_replace("/\/$constName\//", "/$constValue/", $classPath);
    
        if (is_file($classPath)) {
            $classSource = file_get_contents($classPath);
 
            if (strpos($classSource, 'namespase') < strpos($classSource, 'class')) {
                // TODO: вообще нужно заменять только первый неймспейс, но в целях демонстрации упростим
                $classSource = str_replace($constName, $constValue, $classSource);
            
                // Удаляем BOM
                if (substr($classSource, 0, 3) == pack('CCC', 0xef, 0xbb, 0xbf)) {
                    $classSource = substr($classSource, 3);
                }
                
                // Удаляем <?php
                if (substr($classSource, 0, 5) === '<?php') {
                    $classSource = substr($classSource, 5);
                }
                
                // Удаляем <?
                if (substr($classSource, 0, 2) === '<?') {
                    $classSource = substr($classSource, 5);
                }
                
                eval($classSource);
 
                return true;
            }
        }
    }
});
 
 
define('MY_SUPER_CONST', 'Bar');
 
$class = 'modules\\' . MY_SUPER_CONST . '\\Foo';
 
new $class();
Есть в нем несколько ограничений:
1) Перед неймспейсом не должно быть комментариев, по крайней мере содержащих слова "namespase" и "class"
2) Каждый класс должен быть в своем файле
3) В каждом файле не должно описываться более одного класса

Решение в целом приемлемое, если ты пишешь фреймворк, cms или ещё что-то инфрастуктурное. Программист, решающий прикладную задачу, с этим кодом сталкиваться не должен. Для описания бизнес-логики этот подход неудобен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.07.2017, 19:10

Case с отрицательной константой
switch (dir) { case 'С': case 'с': switch (cmd) { case '1': dir = 'З'; break; case '-1': dir = 'В'; ...

Численное интегрирование, с константой
Доброго времени суток! Считает ли математика выражения содержащие буквенную константу? Если да, то как это посчитать? Но самое...

Сравнение значения переменной с константой
Есть вот такой код: Set x7_5=2 Set x=x7_5 Set blok=%%%x%%% If %blok%==2 exit В 4 строке получается сравнение %х%==2, а не...

Массивы, инициализация размера не константой
Здравствуйте. Только начал вливаться в Ваши стройные ряды ;) Вопроса два глупых (догадываюсь про ответы, но хотел бы уточнить) ...

Как объявить строку константой
Как объявить строку константой в СИ?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru