<!DOCTYPE html>
<html lang="ru">
	<head>
		<meta charset="utf-8">
		<title>Своя функция для автозагрузки классов в ООП в PHP | </title>
		
		<link rel="stylesheet" href="/tore/@/fonts/listΣ.css?v=1">
<link rel="stylesheet" href="/tore/layd/deff/&/aefb44b7dac371a3860e9079298a950e.ructΣ.css">
<link rel="stylesheet" href="/tore/&/2290bf7aeadc4261337d6f570a3cf0c5.apprΣ.css">

<script src="/tore/&/77748427269d1c81490f5acb6ce46fc1.apprΣ.js" defer></script>


<meta name="yandex-verification" content="00eb45b7559e5c68">
<meta name="google-site-verification" content="Af0TM2OrwIEtjoQXxYz2-1C-21E1m7DB23_kWpE9sLg">
<meta name="viewport" content="width=device-width, initial-scale=1.0">		
		<meta name="description" content="В данном уроке мы с вами сделаем свою автозагрузку классов в ООП в PHP.">
		<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
	</head>
	<body id="top" data-gq="N">
		<div data-r="ruct/wrap">
			<header>
				<div data-r="ruct/topp">
	<div data-r="topp/left">
		<div data-w="nict/logo">
	<img data-e="img" data-x src="" alt="">
</div>	</div>
	<div data-r="topp/righ">
		offline version v3	</div>
	<div data-r="topp/cent">
		<div data-w="nict/adv">
			<a href="https://mentor.code.mu">
			Запись на курсы по HTML, CSS, JavaScript, PHP, фреймворкам и CMS,<br>
			<b>а также</b>: помощь в поиске работы и заказов, стажировка
			на реальных проектах&rarr;
		</a>
	</div>	</div>
</div>								
				<div data-r="ruct/navi">
					<div data-w="nict/over">
			<span data-e="hash" data-x>⊗ppOpNsAlOF</span>
				<span data-e="lofo" data-x>144 of 179</span>
				<a href="/ru/php/book/oop/" data-e="link" data-x>menu</a>
	</div>					<nav data-w="nict/mainmenu">
	<section data-e="main" data-x data-gm-acte="T">
		<span data-q-href="/ru/markup/" data-e="open" data-x data-m-targ="markup">Верстка</span>
		<span data-q-href="/ru/javascript/" data-e="open" data-x data-m-targ="javascript">JavaScript</span>
		<span data-q-href="/ru/php/" data-e="open" data-x data-m-targ="php">PHP</span>
		<span data-q-href="/ru/javascript/typescript/" data-e="open" data-x data-m-targ="typescript">TypeScript</span>
		<span data-q-href="/ru/javascript/nodejs/" data-e="open" data-x data-m-targ="nodejs">NodeJS</span>
		<span data-q-href="/ru/python/" data-e="open" data-x data-m-targ="python">Python</span>
		<span data-q-href="/ru/java/" data-e="open" data-x data-m-targ="java">Java</span>
		<span data-q-href="/ru/cpp/" data-e="open" data-x data-m-targ="cpp">C++</span>
		<span data-q-href="/ru/rust/" data-e="open" data-x data-m-targ="rust">Rust</span>
		<span data-q-href="/ru/sql/" data-e="open" data-x data-m-targ="sql">SQL</span>
		<span data-q-href="/ru/javascript/framework/vue/" data-e="open" data-x data-m-targ="vue">Vue</span>
		<span data-q-href="/ru/javascript/framework/react/" data-e="open" data-x data-m-targ="react">React</span>
		<span data-q-href="/ru/javascript/framework/angular/" data-e="open" data-x data-m-targ="angular">Angular</span>
		<span data-q-href="/ru/javascript/lib/jquery/" data-e="open" data-x data-m-targ="jquery">jQuery</span>
		<span data-q-href="/ru/php/framework/laravel/" data-e="open" data-x data-m-targ="laravel">Laravel</span>
		<span data-q-href="/ru/git/" data-e="open" data-x data-m-targ="git">Git</span>
		<span data-q-href="/ru/tool/webpack/" data-e="open" data-x data-m-targ="webpack">Webpack</span>
		<span data-q-href="/ru/tool/gulp/" data-e="open" data-x data-m-targ="gulp">Gulp</span>
		<span data-q-href="/ru/tool/terminal/" data-e="open" data-x data-m-targ="terminal">Terminal</span>
		<span data-q-href="/ru/internet/" data-e="open" data-x data-m-targ="internet">Internet</span>
		<span data-q-href="/ru/theory/glossary/" data-e="open" data-x data-m-targ="glossary">Глоссарий</span>
		<span data-q-href="/ru/theory/slang/" data-e="open" data-x data-m-targ="slang">Сленг</span>
		<span data-e="open" data-x data-m-targ="social">Соц. сети</span>
	</section>

	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="markup">
		<a href="/ru/markup/book/prime/">Основной учебник</a>
		<a href="/ru/markup/book/supreme/">Высший учебник</a>
		<a href="/ru/markup/book/prep/less/">Учебник LESS</a>
		<a href="/ru/markup/book/prep/sass/">Учебник SASS</a>
		<a href="/ru/markup/manual/html/">Справочник HTML</a>
		<a href="/ru/markup/manual/css/">Справочник CSS</a>
	</section>

	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="php">
		<a href="/ru/php/book/prime/">Основной учебник</a>
		<a href="/ru/php/book/supreme/">Высший учебник</a>
		<a href="/ru/php/book/oop/">Учебник ООП и MVC</a>
		<a href="/ru/php/book/parsing/">Учебник парсинга</a>
		<a href="/ru/php/tasker/stager/">Задачник по уровням</a>
		<a href="/ru/php/manual/">Справочник</a>
		<a href="/ru/php/video/lesson/">Видеоуроки</a>
		<a href="/ru/php/faq/">FAQ</a>
	</section>

	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="javascript">
		<a href="/ru/javascript/book/prime/">Основной учебник</a>
		<a href="/ru/javascript/book/practice/">Учебник практики</a>
		<a href="/ru/javascript/book/supreme/">Высший учебник</a>
		<a href="/ru/javascript/book/oop/">Учебник ООП</a>
		<a href="/ru/javascript/tasker/stager/">Задачник по уровням</a>
		<a href="/ru/javascript/manual/">Справочник</a>
		<a href="/ru/javascript/video/lesson/">Видеоуроки</a>
		<a href="/ru/javascript/mistake/">Ошибки</a>
		<a href="/ru/javascript/faq/">FAQ</a>
	</section>

	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="nodejs">
		<a href="/ru/javascript/nodejs/book/prime/">Основной учебник</a>
		<a href="/ru/javascript/nodejs/book/express/">Express</a>
		<a href="/ru/javascript/nodejs/book/mongo/">Mongo</a>
		<a href="/ru/javascript/nodejs/book/hosting/">Хостинг</a>
		<a href="/ru/javascript/nodejs/manual/">Справочник</a>
	</section>
	
	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="python">
		<a href="/ru/python/book/prime/">Основной учебник</a>
		<a href="/ru/python/book/supreme/">Высший учебник</a>
		<a href="/ru/python/manual/">Справочник</a>
		<a href="/ru/python/faq/">FAQ</a>
		<a href="/ru/python/tasker/stager/">Задачник по уровням</a>
	</section>
	
	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="java">
		<a href="/ru/java/tasker/stager/">Задачник по уровням</a>
	</section>
	
	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="cpp">
		<a href="/ru/cpp/tasker/stager/">Задачник по уровням</a>
	</section>
	
	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="rust">
		<a href="/ru/rust/tasker/stager/">Задачник по уровням</a>
	</section>
	
	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="sql">
		<a href="/ru/sql/manual/">Справочник</a>
		<a href="/ru/sql/tasker/stager/">Задачник по уровням</a>
	</section>

	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="typescript">
		<a href="/ru/javascript/typescript/book/prime/">Основной учебник</a>
		<a href="/ru/javascript/typescript/book/supreme/">Высший учебник</a>
	</section>

	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="vue">
		<a href="/ru/javascript/framework/vue/book/prime/">Основной учебник</a>
	</section>

	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="react">
		<a href="/ru/javascript/framework/react/book/prime/">Основной учебник</a>
		<a href="/ru/javascript/framework/react/book/supreme/">Высший учебник</a>
		<a href="/ru/javascript/framework/react/book/redux/">Учебник Redux</a>
	</section>
	
	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="angular">
		<a href="/ru/javascript/framework/angular/book/prime/">Основной учебник</a>
	</section>
	
	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="jquery">
		<a href="/ru/javascript/lib/jquery/book/prime/">Основной учебник</a>
		<a href="/ru/javascript/lib/jquery/manual/">Справочник</a>
	</section>

	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="laravel">
		<a href="/ru/php/framework/laravel/book/prime/">Основной учебник</a>
	</section>
	
	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="git">
		<a href="/ru/git/book/prime/">Основной учебник</a>
	</section>
	
	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="terminal">
		<a href="/ru/tool/terminal/">Учебник по командной строке</a>
	</section>
	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="webpack">
		<a href="/ru/tool/webpack/">Учебник Webpack</a>
	</section>
	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="gulp">
		<a href="/ru/tool/gulp/">Учебник Gulp</a>
	</section>
	
	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="internet">
		<a href="/ru/internet/protocol/http/">Протокол HTTP</a>
	</section>
	
	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="glossary">
		<a href="/ru/theory/glossary/">Глоссарий программистских терминов</a>
	</section>
	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="slang">
		<a href="/ru/theory/slang/">Сленг программиста</a>
	</section>
	
	<section data-e="subb" data-x data-gm-acte="F" data-m-tabb="social">
		<a href="https://vk.com/codemu">Паблик сайта code.mu</a>
		<a href="https://t.me/javascript_tricker">Занимательные задачи JavaScript</a>
		<a href="https://t.me/php_tricker">Занимательные задачи PHP</a>
	</section>
</nav>									</div>
			</header>
			<main>
				<div data-w="nict/hett">
	<h1>Своя функция для автозагрузки классов</h1>
</div>				<div data-p="cont/pane">
<p>
	Часто автозагрузка по умолчанию может вас
	не устраивать по каким-нибудь причинам. В
	таком случае можно написать свою автозагрузку.
</p>
<p>
	Для этого в функцию <code data-gs="comd/c" data-x>spl_autoload_register</code>
	нужно первым параметром передать написанную
	вами функцию-коллбэк. Эта функция будет вызываться,
	когда PHP будет обнаруживать обращение к
	незагруженному классу. В параметр этой функции
	будет попадать имя класса с пространством имен:
</p>
<div data-p="bock/pane">
	<code data-w="bock/code" data-lo="high" data-m-lang="php">&lt;?php
	spl_autoload_register(function($class) {
		// в переменной $class будет имя класса с пространством имен
	});
?&gt;</code>
</div>
<p>
	А обязанностью функции будет по имени класса
	выполнить загрузку этого класса через <code data-gs="comd/c" data-x>require</code>.
	То есть внутри этой функции мы должны прописать
	свое правило для загрузки классов, то есть
	свое соглашение имен.
</p>
<p>
	Давайте напишем пример какой-нибудь своей
	автозагрузки. Пусть, например, мы говорим,
	что путь к файлу класса от корня сайта будет
	такой же, как и пространство имен, но с сохранением
	регистра символов.
</p>
<p>
	То есть, если у нас есть класс <code data-gs="comd/c" data-x>Core\Admin\PageController</code>,
	то путь к нему должен быть <code data-gs="comd/p" data-x>Core/Admin/PageController.php</code>.
</p>
<p>
	Как вы видите, для преобразования имени класса
	с его пространством нужно просто поменять
	обратные слеши на прямые, а к имени класса
	добавить <code data-gs="comd/p" data-x>.php</code>. Сделаем это:
</p>
<div data-p="bock/pane">
	<code data-w="bock/code" data-lo="high" data-m-lang="php">&lt;?php
	spl_autoload_register(function($class) {
		$filename = str_replace('\\', '/', $class) . '.php';
		require($filename);
	});
?&gt;</code>
</div>
<p>
	У нас, однако, получится относительный путь
	к файлу (относительно корня сайта). Лучше
	сделать абсолютный путь, вот так:
</p>
<div data-p="bock/pane">
	<code data-w="bock/code" data-lo="high" data-m-lang="php">&lt;?php
	spl_autoload_register(function($class) {
		$root = $_SERVER['DOCUMENT_ROOT'];
		$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
		require($filename);
	});
?&gt;</code>
</div>
<p>
	Есть еще нюанс. В разных операционных системах
	путь по папкам может быть с прямым слешем
	или с обратным. Сделаем наш код независимым
	от операционной системы. Для этого вместо
	прямого слеша для разделения путей будем
	ставить константу <code data-gs="comd/c" data-x>DIRECTORY_SEPARATOR</code>,
	содержащую правильный слеш той операционной
	системы, в который сейчас запускается наш
	скрипт. В итоге получим следующий код:
</p>
<div data-p="bock/pane">
	<code data-w="bock/code" data-lo="high" data-m-lang="php">&lt;?php
	spl_autoload_register(function($class) {
		$root = $_SERVER['DOCUMENT_ROOT'];
		$ds = DIRECTORY_SEPARATOR;
		
		$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
		require($filename);
	});
?&gt;</code>
</div>
<div data-w="cont/task">
	<p>
		Потестируйте созданную мною функцию автозагрузки.
	</p>
</div>
<div data-w="cont/task">
	<p>
		Придумайте свое правило автозагрузки и реализуйте
		его.
	</p>
</div>
</div>			</main>
				<div data-w="nict/nebr">
					<a href="/ru/php/book/oop/autoloading/spl_autoload_register-rules/" data-e="prev" data-x>
				<span data-e="arow" data-x>&larr;</span>
			</a>
							<a href="/ru/php/book/oop/mvc/using/intro/" data-e="next" data-x>
				<span data-e="arow" data-x>&rarr;</span>
			</a>
			</div>
			<footer data-w="ruct/foot">
				<div data-w="nict/finf">
	<span data-e="text" data-x>
		Трепачёв Дмитрий &copy; 2012-2024	</span>
	<br>
	<a data-e="link" data-x href="https://t.me/trepachev_dmitry">t.me/trepachev_dmitry</a>
</div>							</footer>
			<div data-w="nict/jump">
	<a href="#top"><span>&uarr;</span></a>
</div>			<div data-w="nict/lagr">
	</div>					</div>
		
		<script src="/tore/@/metrikaΣ.js?v=1"></script>	</body>
</html>