Задать вопрос
dzheka3d
@dzheka3d

Как работает autoload с пространствами имен?

Всем привет! Помогите разобраться с автоматическим подключением классов на таком примере. Вопросы написал в коде в комментариях.
Есть три файла:
/index.php
spl_autoload_register(
	function($class_name){
		$class_name = str_replace('\\', '/', $class_name);

		require_once $_SERVER['DOCUMENT_ROOT'].'/'.$class_name.'.php';
	}
);

// я импортировал пространство имен, но класс ClassChild не будет искаться в нем
use modules\voting;

$ClassChild = new ClassChild;

// чтобы импортированное пространство имен работало, мне нужно сделать так:
// почему?
use modules\voting as vot;

$ClassChild = new vot\ClassChild;


/modules/voting/ClassChild.php
// класс ClassChild и ClassParent находятся в одном пространстве имен
// но при наследовании класса ClassParent, он так же не подключается
// почему? как его подключить в этой ситуации?

namespace modules\voting;

class ClassChild extends ClassParent{
	public function __construct(){
		echo __CLASS__.'!<br>';	
	}
}


/modules/voting/ClassParent.php
namespace modules\voting;

class ClassParent{
	public function __construct(){
		echo __CLASS__.'!<br>';	
	}
}
  • Вопрос задан
  • 119 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@Arik
1. Наверно нужно
use modules\voting\ClassChild;
$ClassChild = new ClassChild;


2. Вроде должно работать. Если ждете что должен вывести два раза то нужно добавить вызов родителя
parent:: __construct ()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
SerafimArts
@SerafimArts
Senior Notepad Reader
Потому что в секции use указывается FQN класса, а не его пространство имён: php.net/manual/ru/language.namespaces.importing.php ;)

use modules\voting\ClassChild;

Ах да, ещё про PSR бы почитать =)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 дек. 2024, в 20:40
10000 руб./за проект
22 дек. 2024, в 20:34
3000 руб./за проект
22 дек. 2024, в 20:12
10000 руб./за проект