<!DOCTYPE html>
<html lang="ru">
	<head>
		<meta charset="utf-8">
		<title>Своя функция для автозагрузки классов в ООП на PHP | Трепачёв Дмитрий</title>
		
		<link rel="stylesheet" href="/css/fonts/list.css?v=8">
		<link rel="stylesheet" href="/css/styles.css?v=323">
		<link rel="stylesheet" href="/js/highlighter/highlighter.css?v=79">
		
		<script src="/js/highlighter/highlighter.js?v=118"></script>
		
		<script src="/js/location.js?v=3"></script>
		<script src="/js/locale.js?v=5"></script>
		<script src="/js/main.js?v=130"></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">
		<div class="wrapper">
			<header>
				<div class="top">
	<div class="left"><img data-module="coder" src="" alt=""></div>
	<div class="right">
		offline version 0.0.2	</div>
	<div class="center">
			<a href="http://mentor.code.mu">
		Запись на курсы по HTML, CSS, JavaScript, PHP, фреймворкам и CMS,<br>
		<b>а также</b>: помощь в поиске работы и заказов, стажировка
		на реальных проектах&rarr;
	</a>
	</div>
</div>								<nav data-module="mainmenu">
	<section class="main active">
		<span data-href="/ru/markup/" data-open="markup">Верстка</span>
		<span data-href="/ru/javascript/" data-open="javascript">JavaScript</span>
		<span data-href="/ru/php/" data-open="php">PHP</span>
		<span data-href="/ru/javascript/typescript/" data-open="typescript">TypeScript</span>
		<span data-href="/ru/javascript/nodejs/" data-open="nodejs">NodeJS</span>
		<span data-href="/ru/sql/" data-open="sql">SQL</span>
		<span data-href="/ru/javascript/framework/vue/" data-open="vue">Vue</span>
		<span data-href="/ru/javascript/framework/react/" data-open="react">React</span>
		<span data-href="/ru/javascript/lib/jquery/" data-open="jquery">jQuery</span>
		<span data-href="/ru/php/framework/laravel/" data-open="laravel">Laravel</span>
		<span data-href="/ru/tool/" data-open="tool">Tools</span>
		<span data-href="/ru/internet/" data-open="internet">Internet</span>
		<!--<span data-href="/ru/theory/" data-open="theory">Теория</span>-->
	</section>

	<section class="sub" data-name="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 class="sub" data-name="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>
	</section>

	<section class="sub" data-name="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 class="sub" data-name="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>
	</section>
	<section class="sub" data-name="sql">
		<a href="/ru/sql/manual/">Справочник</a>
	</section>

	<section class="sub" data-name="typescript">
		<a href="/ru/javascript/typescript/book/prime/">Основной учебник</a>
	</section>

	<section class="sub" data-name="vue">
		<a href="/ru/javascript/framework/vue/book/prime/">Основной учебник</a>
	</section>

	<section class="sub" data-name="react">
		<a href="/ru/javascript/framework/react/book/prime/">Основной учебник</a>
	</section>
	
	<section class="sub" data-name="jquery">
		<a href="/ru/javascript/lib/jquery/book/prime/">Основной учебник</a>
		<a href="/ru/javascript/lib/jquery/manual/">Справочник</a>
	</section>

	<section class="sub" data-name="laravel">
		<a href="/ru/php/framework/laravel/book/prime/">Основной учебник</a>
	</section>
	
	<section class="sub" data-name="tool">
		<a href="/ru/tool/terminal/">Командная строка</a>
		<a href="/ru/tool/webpack/">Сборщик Webpack</a>
		<a href="/ru/tool/gulp/">Сборщик Gulp</a>
	</section>
	
	<section class="sub" data-name="internet">
		<a href="/ru/internet/protocol/http/">Протокол HTTP</a>
	</section>
	<!--
	<section class="sub" data-name="wordpress">
		<a href="http://dep.code.mu/ru/cms/wordpress/book/prime/administration/">Учебник администратора</a>
		<a href="http://dep.code.mu/ru/cms/wordpress/book/prime/development/">Учебник разработчика</a>
		<!--
		<a href="/ru/cms/wordpress/book/prime/administration/">Учебник администратора</a>
		<a href="/ru/cms/wordpress/book/prime/development/">Учебник разработчика</a>
		
	</section>
	-->
</nav>							</header>
			<main>
				<h1>Своя функция для автозагрузки классов</h1>
				<div class="content">
<p>
	Часто автозагрузка по умолчанию может вас
	не устраивать по каким-нибудь причинам. В
	таком случае можно написать свою автозагрузку.
</p>
<p>
	Для этого в функцию <code class="code inline">spl_autoload_register</code>
	нужно первым параметром передать написанную
	вами функцию-коллбэк. Эта функция будет вызываться,
	когда PHP будет обнаруживать обращение к
	незагруженному классу. В параметр этой функции
	будет попадать имя класса с пространством имен:
</p>
<div class="block">
	<code class="highlight" data-module="highlight" data-lang="php">&lt;?php
	spl_autoload_register(function($class) {
		// в переменной $class будет имя класса с пространством имен
	});
?&gt;</code>
</div>
<p>
	А обязанностью функции будет по имени класса
	выполнить загрузку этого класса через <code class="code inline">require</code>.
	То есть внутри этой функции мы должны прописать
	свое правило для загрузки классов, то есть
	свое соглашение имен.
</p>
<p>
	Давайте напишем пример какой-нибудь своей
	автозагрузки. Пусть, например, мы говорим,
	что путь к файлу класса от корня сайта будет
	такой же, как и пространство имен, но с сохранением
	регистра символов.
</p>
<p>
	То есть, если у нас есть класс <code class="code inline">Core\Admin\PageController</code>,
	то путь к нему должен быть <code class="path inline">Core/Admin/PageController.php</code>.
</p>
<p>
	Как вы видите, для преобразования имени класса
	с его пространством нужно просто поменять
	обратные слеши на прямые, а к имени класса
	добавить <code class="path inline">.php</code>. Сделаем это:
</p>
<div class="block">
	<code class="highlight" data-module="highlight" data-lang="php">&lt;?php
	spl_autoload_register(function($class) {
		$filename = str_replace('\\', '/', $class) . '.php';
		require($filename);
	});
?&gt;</code>
</div>
<p>
	У нас, однако, получится относительный путь
	к файлу (относительно корня сайта). Лучше
	сделать абсолютный путь, вот так:
</p>
<div class="block">
	<code class="highlight" data-module="highlight" data-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 class="code inline">DIRECTORY_SEPARATOR</code>,
	содержащую правильный слеш той операционной
	системы, в который сейчас запускается наш
	скрипт. В итоге получим следующий код:
</p>
<div class="block">
	<code class="highlight" data-module="highlight" data-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 class="task">
	<p>
		Потестируйте созданную мною функцию автозагрузки.
	</p>
</div>
<div class="task">
	<p>
		Придумайте свое правило автозагрузки и реализуйте
		его.
	</p>
</div>
</div>			</main>
			<div class="bottom">
	<section class="pages" data-url="/ru/php/book/oop/" data-persent="84" data-hash="ppOpNsAlOF" data-quantity="107" data-num="91"><a href="/ru/php/book/oop/autoloading/default/" class="prev"><span class="arrow">&larr;</span></a><a href="/ru/php/book/oop/mvc/using/intro/" class="next"><span class="arrow">&rarr;</span></a></section></div>			<footer>
	<div class="contacts">
	Трепачёв Дмитрий &copy; 2012-2023 <br>
	<a href="https://t.me/trepachev_dmitry">t.me/trepachev_dmitry</a>
</div>		
</footer>			<div class="jump">
	<a href="#top" class="to-top">&uarr;</a>
</div>			<div class="langer">
	</div>			</div>
		</div>
		
		<script src="/js/metrika.js?v=1"></script>	</body>
</html>