Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 20.03.2019
Сообщений: 68

Namespace and autoload

21.03.2019, 10:33. Показов 2108. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Не самостоятельно разобраться. Прошу помочь.
Ситуация такая: У меня есть класс, который определен в пространстве имен. Например так

namespace ru\MaxBmt
class Valid
{
public $name;
public $login;
}

Он помещен в отдельный файл valid.php
Он, в свою очередь в папку 'lib'. А в файле index.php я хочу его подключить через автозагрузку

set_include_path(get_include_path().PATH _SEPARATOR.'lib');
spl_autoload_extensions('.php');
spl_autoload_register();

Но как мне в этом случае учесть в синтаксисе пространство имен?


Листинг.

Файл valid_class.php (в папке lib)

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
<?php //namespace ru\MaxBmt;
 
    class Valid {
        
        
        public static function validEmail($email) {
            //$reg_1 = '/^[a-z0-9_]+(\.[a-z0-9_-]+)*@([0-9a-z][0-9a-z]*\.)+([a-z]){2,4}$/';
            $reg_2 = '/^.{5,256}$/';
            $reg_3 = '/^.{1,4}$/';
            if(empty($email)) throw new Exception('E-mail не указан ');
            if(preg_match($reg_3, $email)) throw new Exception('E-mail слишком короткий');
            if(!preg_match($reg_2, $email)) throw new Exception('E-mail слишком длинный');
            if(filter_var($email,FILTER_VALIDATE_EMAIL) !== $email) throw new Exception('E-mail указан не верно');
            
            //echo 'Вы ввели электронный адрес: '.$email;
            sleep(2);
            header('Location:a.php');
            session_start();
            $_SESSION['email'] = $_POST['email'];
            echo 'Вы ввели электронный адрес: '.$email;
            return $email;
            
            
        }
    }

Файл index.php

PHP/HTML
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
<?php
//use ru\MaxBmt\Valid;
set_include_path(get_include_path().PATH_SEPARATOR.'lib');
    spl_autoload_extensions('_class.php');
    spl_autoload_register();
    
    
    
        if(isset($_POST['form'])) {
            
            
                $a = $_POST['email'];
                $email = htmlspecialchars($a);
            
try {
    
        
        Valid::validEmail($email);
    } catch (Exception $e) {
        echo '<br />Возникла ошибка: '.$e->getMessage();
    }
 
        }
 
    ?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Проверка на валидноссть</title>
</head>
 
<body>
    
    <form name="form" method="post" action="index.php">
        <label>Email: 
        <input type="text" name="email">
            <button name="form" type="submit">Отправить</button>
        </label>
    </form>
</body>
</html>
Файл а.php

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
session_start();
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Тест А</title>
</head>
 
<body>
    <p>Вы ввели электронный адрес: <?=$_SESSION['email']; ?></p>
</body>
</html>

Исходники:

https://dropmefiles.com/NqYfj


Eсли раскомментировать пространство имен - то работать не будет. Пожалуйста подскажите.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.03.2019, 10:33
Ответы с готовыми решениями:

Области видимости namespace .Ошибка No code may exist outside of namespace {}
&lt;?php namespace MyProject{ class ClassA { public $val = 'MyProject &quot;ClassA&quot;'; } } namespace MyProject2{ class ClassA { ...

Autoload на mvc
Доброго времени суток! Подскажите пожалуйста, нет ли у кого примера route в реализации php, чтобы там была реализована функция __autoload....

Реализация autoload на mvc
Подскажите как мне избавится от include в моем маршрутизаторе, и реализовать функцию autoload для автоматической загрузки классов. Вот мой...

3
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
21.03.2019, 11:18
Цитата Сообщение от Bigthanks Посмотреть сообщение
Но как мне в этом случае учесть в синтаксисе пространство имен?
Передать в spl_autoload_register функцию, в которой пытаться подключать скрипты по названию класса без пространства имён.

Но лучше начать следовать PSR-4 и генерировать автозагрузчик через Composer, тогда подобных проблем не будет.
1
0 / 0 / 0
Регистрация: 20.03.2019
Сообщений: 68
21.03.2019, 11:28  [ТС]
Цитата Сообщение от Jodah Посмотреть сообщение
Передать в spl_autoload_register функцию, в которой пытаться подключать скрипты по названию класса без пространства имён.
Но лучше начать следовать PSR-4 и генерировать автозагрузчик через Composer, тогда подобных проблем не будет.
Спасибо, без компосера никак?

Добавлено через 4 минуты
Все, понял. Вы дали ответ вначале, я не увидел. Но я не догоняю как это сделать.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
21.03.2019, 11:49
Лучший ответ Сообщение было отмечено Bigthanks как решение

Решение

Bigthanks,

index.php
PHP
1
2
3
4
5
6
7
8
9
10
11
<?php
spl_autoload_register(function($class){
    $parts = explode('\\', $class);
    $path = __DIR__ . '/' . mb_strtolower(end($parts)) . '.php';
    
    if(file_exists($path))
        require_once($path);
});
 
$obj = new Some1\Some2\Valid();
$obj->test(); // success!
valid.php в той же папке
PHP
1
2
3
4
5
6
7
8
9
10
<?php
namespace Some1\Some2;
 
class Valid
{
    public function test()
    {
        echo 'success!';
    }
}
Добавлено через 7 минут
Bigthanks, но это плохой вариант, поскольку при вызове двух классов с разными названиями (Some1/Valid и Some2/Valid к примеру) произойдёт ошибка, поскольку игнорируется пространство имён.

Либо можно так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
spl_autoload_register(function($class){
    $files = [
        'Some1\Some2\Valid' => 'valid.php'
    ];
    
    if(!isset($files[$class]))
        return;
    
    require_once($files[$class]);
});
 
$obj = new Some1\Some2\Valid();
$obj->test(); // success!
Т.е. задаём для каждого файла путь к нему вручную. Но это тоже извращение. Думаю, единственное адекватное решение - это PSR-4 и самописная автозагрузка, если не хочется использовать композер.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.03.2019, 11:49
Помогаю со студенческими работами здесь

Головоломка с namespace в большом солюшине, проект подхватывает чужой namespace
Добрый вечер! Народ, подскажите, пожалуйста, что-то я никак понять не могу. Проблема в следующем: есть некое решение, в котором 50...

Ошибка CS0234 The type or namespace name 'Office' does not exist in the namespace 'Microsoft'
Здравствуйте. Помогите разобраться. Сбилдил проект после переустановки винды и тут такая ошибка. Error CS0234 The type or namespace name...

The type or namespace name 'DirectoryServices' does not exist in the namespace 'System'
Подскажите, пожалуйста! Только начинаю на C# писать!:scratch: Вот такой вроде небольшой кодик: using System; using...

Какую ссылку добавить для решения проблемы "namespace name 'Drawing' does not exist in the namespace 'System'"
уже который раз сталкиваюсь с этой проблемой. Ошибка: The type or namespace name 'Drawing' does not exist in the namespace 'System' (are...

Autoload with composer
Прошу помощи, т.к. сам уже кажется всё перепробовал. Задача казалось бы простая: автозагрузка файлов и классов с использованием...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru