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

Получение объекта в другом классе и его использование

04.11.2016, 01:44. Показов 1485. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, не давно изучаю php, и столкнулся с такой проблемой:
Допустим есть класс Request и у него есть метод getHello(), я подключаю его к другому классу EnterExitController с помощью "use", естественно я хочу использовать объект класса Request во всех методах EnterExitController, поэтому я добавляю в класс private $request; и в конструкторе инициализирую $this->request = new Request(); , теперь как мне кажется я мог бы использовать этот объект в всех методах с помощью геттера или просто везде писать $this->request->getHello();. Но вместо этого у меня происходит ошибка:"Fatal error: Uncaught Error: Using $this when not in object context". Я знаю английский и поэтому мне в принципе понятно, что в ошибке сказано, но не понятно как это исправить?? Методы класса EnterExitController я задействую с помощью формы. Ниже код

Request:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?php
 
namespace App\System;
 
class Request
{
    /**
     * All request data.
     *
     * @var array
     */
    private $request = [];
    private $hello;
 
    public function __construct()
    {
        $this->setRequest($_SERVER);
        $this->setHello('Mark');
    }
    public function setHello($br){
        $this->hello=$br;
    }
    public function getHello(){
        return 'Hello '.$this->hello;
    }
 
    /**
     * @removes session's item
     */
    public function deleteSession($name){
        unset($_SESSION[$name]);
    }
    /**
     * @get session's item
     */
    public function getSession($name)
    {
        return $_SESSION[$name];
    }
 
    /**
     * @sets session's item
     */
    public function setSession($name , $value)
    {
        $_SESSION[$name] = $value;
    }
    /**
     * @return mixed
     */
    public function getRequest()
    {
        return $this->request;
    }
 
    /**
     * @param mixed $request
     */
    public function setRequest($request)
    {
        $this->request = $request;
    }
 
    /**
     * @return string
     */
    public function getUri()
    {
        if ($this->request['REQUEST_URI'] == '/') {
            return $this->request['REQUEST_URI'];
        } else {
            return trim($this->request['REQUEST_URI'], '/');
        }
    }
 
    public function getMethod()
    {
        return $this->request['REQUEST_METHOD'];
    }
}
EnterExitController:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
 
namespace App\Controllers;
 
use App\Models\UserViewModel;
use App\System\Request;
 
class EnterExitController
{
    private $request;
 
    /**
     * @return Request
     */
 
    public function __construct(){
        $this->request = new Request();
    }
    public function getRequest(): Request
    {
        return $this->request;
    }
    public function actionExit()
    {
        $this->request->deleteSession('Admin');
        header('location: /enter');
    }
 
 
    public function actionLog()
    {
        $r = $this->getRequest();
        echo $r->getHello();
/*        if ($this->request->getMethod() == 'POST') {
            $user = new UserViewModel();
            $login = trim(strip_tags($_POST['login']));
            $pass = trim(strip_tags($_POST['pass']));
            $verMass = $user->getUser($login);
            $verHash = '';
            foreach ($verMass as $items) {
                $verHash = $items['pass'];
            }
            if (password_verify($pass, $verHash)) {
 
            } else {
 
            }
        }*/
    }
}
Что самое главное экспериментировал с одним классом Main и там всё нормально работает, видно потому что я там явно инициализирую объект класса в последних строках :
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
use App\System\Request;
 
class Main
{
    private $request;
 
    public function __construct()
    {
        $this->request = new Request();
    }
 
    public function sayHello()
    {
 
        echo $this->request->getHello();
    }
}
$hello = new Main();
$hello->sayHello();
Кстати если инициализировать в конкретных методах объект Request, то работать будет и EnterExitController, т.е. если в методе actionLog() прописать такие строки :
PHP
1
2
3
4
public function actionLog(){
        $request = new Request();
        echo $request->getHello();
}
Прошу помощи в этом вопросе, извините за избыточность в объяснении ....... Заранее спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.11.2016, 01:44
Ответы с готовыми решениями:

Не баг ли? Объект видит приватные члены другого объекта этого же класса
не баг ли что getObj() можно изменять приватное свойство другого объекта class Exam1 { private $id; public...

Свойству класса присвоить объект другого класса
Добрый день форумчане. Подскажите, пожалуйста. Свойствам класса можно при описании присваивать скалярные значения или массив. А как можно...

Если класс описан, но его объект не создан, грузится ли он в оперативу?
Быть может не очень понятно спросил... вот пример: &lt;? class Foo{ function __construct(){ // Бла бла бла } ...

9
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
04.11.2016, 07:38
Цитата Сообщение от adik3dx Посмотреть сообщение
$this->request->getHello()
Цитата Сообщение от adik3dx Посмотреть сообщение
Что самое главное экспериментировал с одним классом Main и там всё нормально работает
У Вас кроме как в этом Main нигде больше и нету $this->request->getHello().
Цитата Сообщение от adik3dx Посмотреть сообщение
Fatal error: Uncaught Error: Using $this when not in object context
Когда показываете ошибку - показывайте ее целиком. Или хотябы сами укажите, на какую конкретно строку эта ошибка. Почему мы должны гадать сидеть.


Вообще из всего приведенного кода у Вас только этот кусок кода использует эти классы:
PHP
1
2
$hello = new Main();
$hello->sayHello();
При этом из Ваших слов он работает.

Цитата Сообщение от adik3dx Посмотреть сообщение
извините за избыточность в объяснении
Оно действительно и избыточно и недостаточно одновременно В конечном счете не понятно что не получается то

Покажите код, покажите ошибку, покажите на какую из строчек представленного кода указывает эта ошибка, все.
0
0 / 0 / 0
Регистрация: 20.11.2013
Сообщений: 73
04.11.2016, 10:54  [ТС]
Вот ошибка полностью :
Fatal error: Uncaught Error: Using $this when not in object context in D:\xampp\htdocs\site.local\www\app\Contr ollers\EnterExitController.php:32 Stack trace: #0 [internal function]: App\Controllers\EnterExitController::act ionLog() #1 D:\xampp\htdocs\site.local\www\app\App.p hp(27): call_user_func(Array) #2 D:\xampp\htdocs\site.local\www\public\in dex.php(8): App\App->run() #3 {main} thrown in D:\xampp\htdocs\site.local\www\app\Contr ollers\EnterExitController.php on line 32
Я же говорю идёт использование метода класса EnterExitController через форму на сайте, она обращается к классу Router, который возвращает имя нужного класса и метода в call_user_func(). Не работает строка 32 в классе EnterExitController
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
04.11.2016, 11:25
Предполагаю, что call_user_func вызывает метод статически, соответственно в методе не должно быть $this.

Добавлено через 1 минуту
Можете сделать все методы и свойства статическими, тогда должно будет работать. Либо вместо call_user_func создавайте экземпляр класса и вызывайте у него метод через ->.
0
0 / 0 / 0
Регистрация: 20.11.2013
Сообщений: 73
04.11.2016, 11:56  [ТС]
Jodah, нет статики нет

Добавлено через 2 минуты
Jodah, pav1uxa, мне сказали посмотреть в сторону магических методов __call() __callStatic(), может разъясните, что к чему(про эти методы)?
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
04.11.2016, 12:21
Цитата Сообщение от adik3dx Посмотреть сообщение
нет статики нет
Всмысле нет? Покажите, как вы используете call_user_func.

Цитата Сообщение от adik3dx Посмотреть сообщение
может разъясните, что к чему(про эти методы)?
Читайте тут.
1
0 / 0 / 0
Регистрация: 20.11.2013
Сообщений: 73
04.11.2016, 13:01  [ТС]
Jodah,
вот класс App целиком :
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
26
27
28
29
30
31
32
33
34
<?php
 
namespace App;
 
use App\System\Router;
 
class App
{
    public function run()
    {
        $request = new \App\System\Request();
        $module = '';
        $action = '';
        $params = [];
        //echo $request->getUri();
        $url_path = parse_url($request->getUri(), PHP_URL_PATH);
        $uri_parts = explode('/', trim($url_path, ' /'));
        $module = array_shift($uri_parts);
        $action = array_shift($uri_parts);
        for ($i = 0; $i < count($uri_parts); ++$i) {
            $params[$uri_parts[$i]] = $uri_parts[++$i];
        }
        if (empty($params)) {
            //echo $request->getUri();
            $res = preg_split('/@/', (new Router())->getRoute($request->getUri()));
        //var_dump([__NAMESPACE__.'\\Controllers\\'.$res[0], $res[1]]);
            call_user_func([__NAMESPACE__.'\\Controllers\\'.$res[0], $res[1]]);
        } else {
            $res = preg_split('/@/', (new Router())->getRoute(trim($module.'/'.$action, '/')));
            //var_dump([__NAMESPACE__.'\\Controllers\\'.$res[0], $res[1]]);
            call_user_func_array([__NAMESPACE__.'\\Controllers\\'.$res[0], $res[1]], $params);
        }
    }
}
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
04.11.2016, 13:17
adik3dx,
Цитата Сообщение от Jodah Посмотреть сообщение
Предполагаю, что call_user_func вызывает метод статически
Хотя зачем предполагать, если есть документация.

Насколько я понимаю, если вы передаёте массив с названиями класса и метода, например ['Controller', 'method'], то метод вызывается статически, т.е. Controller::method().

А чтобы вызвать нестатический метод, вам надо сначала создать объект, и затем передать его в этот массив. Например [new Class(), 'method'].
1
0 / 0 / 0
Регистрация: 20.11.2013
Сообщений: 73
04.11.2016, 16:55  [ТС]
Jodah, Спасибо за разъяснения, обязательно попробую реализовать передачу объекта в call_user_funс(чуть позже отпишусь что получилось), если есть что либо ещё по теме или какие то идеи по коду, буду рад узнать ваши мысли
0
0 / 0 / 0
Регистрация: 20.11.2013
Сообщений: 73
06.11.2016, 13:30  [ТС]
Jodah, У меня получилось решить проблему с помощью __callStatic, как вы и говорили при таком использовании call_user_function как у меня метод класса вызывался статично, поэтому решение выглядит так :
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
26
27
28
29
30
31
32
33
34
35
36
37
namespace App\Controllers;
 
use App\Models\UserViewModel;
use App\System\Request;
 
class EnterExitController
{
    public static function __callStatic($method, $args)
    {
        return (new Request)->$method($args[0], $args[1]);
    }
 
    public function actionExit()
    {
        self::deleteSession('Admin');
        header('location: /enter');
    }
 
    public function actionLog()
    {
        if (self::getMethod() == 'POST') {
            $user = new UserViewModel();
            $login = trim(strip_tags($_POST['login']));
            $pass = trim(strip_tags($_POST['pass']));
            $verMass = $user->getUser($login);
            $verHash = '';
            foreach ($verMass as $items) {
                $verHash = $items['pass'];
            }
            if (password_verify($pass, $verHash)) {
 
            } else {
 
            }
        }
    }
}
т.е. обращение к методам происходит так : self::getHello(); - естественно у меня в классе EnterExitController нет метода getHello() поэтому идёт обращение к магическому методу __callStatic, в котором я уже вызываю методы из другого класса и передаю параметры(Конечно всё можно ещё сделать красивее и лучше, так как у меня сейчас выходит ошибка Notice если у метода нет аргуметов/ я ведь их пихаю сразу без проверочки). Думаю тема будет полезна новичкам, кто также столкнётся с такой проблемой , всем спасибо!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.11.2016, 13:30
Помогаю со студенческими работами здесь

Почему объявлять класс желательно ДО его использования?
Где-то видел, не найду, где. Что объявлять класс желательно ДО создания объектов. Вообще работает если и ДО объявления класса его начать...

Как из одного объекта получить объект другого класса?
Форумчане, подскажите. У меня есть два класса: class Category{ private $id = ''; private $parentId = ''; private...

Класс не наследует свойство, если там ссылка на другой объект
Есть вот такой класс: namespace controllers\admin; use controllers\admin\DefaultController; class AuthController extends...

Подключение PDO в классе и передача объекта PDO в другой класс
&lt;?php error_reporting(-1); ini_set('display errors', 1); class DataReceived { public $mail; public $phone; ...

Классу нужен другой объект: как правильно?
добрый время сутки) есть класс парсера. ему для работы нужен объект curl. не знаю как правильно: создавать объект curl при создании...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru