Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
 Аватар для SpiritAbsolute
5 / 5 / 1
Регистрация: 07.08.2013
Сообщений: 75

Не подключается класс через переменную

20.09.2014, 13:17. Показов 3035. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем! Подскажите, пожалуйста, в чем может быть проблема.
Есть класс:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php 
namespace folder_class;
 
class Bakery {
    
    public static function factory($pie) {
        echo $pie;
        $object = new $pie;
        return $object;
    }
}
 
?>
С помощью метода factory я подключаю классы. Я передаю в метод название класса 'Apple' таким образом
$obj = Bakery::factory('Apple');
Он выдает ошибку Fatal error: Class 'Apple' not found
Выводу echo, там все нормально , слово Apple.
Меняю строку $object = new $pie; на $object = new Apple;
Срабатывает класс Apple и все замечательно.
Почему через переменную выдает ошибку?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.09.2014, 13:17
Ответы с готовыми решениями:

Через класс B изменить переменную type в классе А
У меня есть класс А. public class A extends B { private int type = 0; public GunsPistol(int type) { super(type); ...

Как увидеть переменную объекта класса через один класс?
т.е. есть класс1. создал класс2, в нем объект класса1. теперь где- то там хочу, вызвав объект класса 2, доступиться до переменной,...

Как новую переменную пронумеровать через другую переменную?
здравствуйте, уважаемые сижу вот голову ломаю над элементарщиной: q=1 arg$q=2 echo $arg1 пытается произвести вычисления...

12
 Аватар для Бабуля
72 / 72 / 29
Регистрация: 10.08.2012
Сообщений: 202
20.09.2014, 13:48
Вот так работает, а возможно я неправильно вас понял...

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php 
 
class Bakery {    
    public static function factory($pie) {
        echo $pie;
        $object = new $pie;
        return $object;
    }
}
 
class apple {
    public function babulja() {
        echo __CLASS__;
    }    
}
 
$Bakery = new Bakery;
$Bakery::factory('apple')->babulja(); // функция класса возвращает созданный новый объект apple
  
?>
0
 Аватар для SpiritAbsolute
5 / 5 / 1
Регистрация: 07.08.2013
Сообщений: 75
20.09.2014, 13:53  [ТС]
нет, не работает. все равно выдает not found...
0
 Аватар для Бабуля
72 / 72 / 29
Регистрация: 10.08.2012
Сообщений: 202
20.09.2014, 13:54
У меня ведь работает=)

Значит проблема в чем-то другом.
0
 Аватар для SpiritAbsolute
5 / 5 / 1
Регистрация: 07.08.2013
Сообщений: 75
20.09.2014, 13:56  [ТС]
Понятно. Вот и нужно понять в чем Почему когда ручками напишу, то работает...
0
 Аватар для Бабуля
72 / 72 / 29
Регистрация: 10.08.2012
Сообщений: 202
20.09.2014, 14:01
Попробуйте создать новый файл и вставить только мой
код, будет ли он работать или нет. Если нет, то
вообще странно)
0
 Аватар для SpiritAbsolute
5 / 5 / 1
Регистрация: 07.08.2013
Сообщений: 75
20.09.2014, 14:07  [ТС]
Ваш код попробовал, он просто выводит на экран имя класса.
А мне нужно создать объект класса с этим именем вот так $object = new $name_pie;
То есть передать в эту переменную имя класса. Так вот если я передаю, он ругается что такой класс не найден.
А если я напишу вместо переменной $name_pie просто название apple, вот так: $object = new apple; то все срабатывает.
Хотя в этой переменной если вывести ее через echo строка apple !
И даже при попытке сделать так:
PHP
1
2
3
4
$class_name = $name_pie;
require ($name_pie . '.php');
$object = new $class_name;
return $object;
Все равно не может найти класс.
0
 Аватар для Бабуля
72 / 72 / 29
Регистрация: 10.08.2012
Сообщений: 202
20.09.2014, 14:15
Тык в моем коде выводится имя класса, который создался
вот так: $object = new $pie;

И имя класса печатается как раз из метода этого класса,
который создался, когда я сделал вот так:

$Bakery::factory('apple')->babulja();

Как видите в функцию передается имя класса, то есть apple,
а в функции присваивается в переменную...

Для чего вам вообще это нужно?

Почему нельзя воспользоваться методом __autoload, который сам будет
подключать нужный класс=)
0
 Аватар для SpiritAbsolute
5 / 5 / 1
Регистрация: 07.08.2013
Сообщений: 75
20.09.2014, 14:23  [ТС]
У меня просто небольшое тестовое задание по ООП.
У меня есть класс index.php.
В котором я запускаю класс, который уже запускает другие классы.
PHP
1
2
3
4
5
6
7
8
9
error_reporting(E_ALL);
ini_set('display_errors', 'on');
 
require __DIR__.'/autoload.php';
use folder_class\Bakery;
 
$name_pie='Cherry';
$obj=Bakery::factory($name_pie);
$obj->production();
В классе Bakery у меня этот метод, который должен запускать классы
PHP
1
2
3
4
public static function factory($name_pie) {
        $object = new $name_pie;
        return $object;
    }
То есть вот мне нужно в переменную $name_pie передавать название класса.
0
365 / 372 / 89
Регистрация: 01.12.2013
Сообщений: 1,629
20.09.2014, 18:49
Цитата Сообщение от SpiritAbsolute Посмотреть сообщение
Он выдает ошибку Fatal error: Class 'Apple' not found
в контексте выполнения программы отсутствует класс Apple... он лежит в каком-то файле. файлы подключаются с помощью директив include или require. В чем вопрос? были такие директивы? Нет? Пропишите их в коде. И они могут автоматически выполнятся если используете spl_autoload_register
0
 Аватар для SpiritAbsolute
5 / 5 / 1
Регистрация: 07.08.2013
Сообщений: 75
20.09.2014, 19:03  [ТС]
У меня подключен автолод
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
 
define('ROOT_PATH', __DIR__ . '/');
define('DS', DIRECTORY_SEPARATOR);
 
/* Class Autoloader */
class Autoloader {
    
    public function __construct() {
        spl_autoload_register([$this, 'loader']);
    }
 
    private function loader($className) {
        $namespace = explode('\\', $className);
        $classPath = ROOT_PATH . join(DS, $namespace) . '.php';
 
        if (is_readable($classPath)) {
            require_once($classPath);
        }
    }
}
 
new Autoloader();
Почему когда я пишу строку:
PHP
1
$object = new Apple;
все срабатывает, а когда пишу:
PHP
1
2
$name_pie="Apple";
$object = new $name_pie;
не срабатывает!
0
365 / 372 / 89
Регистрация: 01.12.2013
Сообщений: 1,629
20.09.2014, 19:05
PHP
1
$object = new $name_pie();
тоже не срабатывает?
0
 Аватар для SpiritAbsolute
5 / 5 / 1
Регистрация: 07.08.2013
Сообщений: 75
21.09.2014, 10:52  [ТС]
Да, со скобками тоже не срабатывает! Мне тут в другом месте подсказали, но я не пойму как тогда прописать.
Вот такой ответ мне дали:
Два дня назад была тема. При создании объекта по классу указанном в строке, нужно указывать полный FQCN, т.е. вместе с пространством имен, т.к. php в таком случае создает объект в глобальном пространстве а не в текущем.
Как мне прописать тогда?

Добавлено через 15 часов 44 минуты
Разобрался, вот так заработало. Спасибо всем за ответы!
PHP
1
2
$name_pie='folder_class\\'.$name_pie;
$object = new $name_pie;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.09.2014, 10:52
Помогаю со студенческими работами здесь

Как передать переменную окна через текстовую переменную?
Открыл одно окно, потом второе, и хочу передать индетефикатор первого окна во второе, чтобы оно там что-то с ним сделало. Как это сделать...

Не подключается класс
Не могу увидеть, что-то забыл дописать.. &lt;head&gt; &lt;style&gt; 111 { height:36pt; font:20pt Arial, Helvetica, sans-serif; ...

Класс А не принимает член-переменную с типом класс Б
Разработка ведётся в Visual Studio 2010 с использованием MFC Есть некий класс AnswersStatistic, header которого приведён ниже: ...

Не подключается телефон через Wi-Fi к компьютеру через приложение
Пару дней назад удалось подключиться, сейчас глухо. Браузер Opera. Приложение называется Evermusic Pro. Роутер напрямую подключен к...

не подключается класс категорий
не подключается класс категорий, его не видит класс ядра. в чем ошибка? класс ядра &lt;?php abstract class Core { public...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru