php Создание объекта по умолчанию из пустого значения? - PullRequest
7 голосов
/ 01 февраля 2011

хорошо, что я пытаюсь сделать, это сделать что-то, чтобы я мог назвать это как $this->model->users->getInfomation('name'); или что-то похожее на мой фреймворк но php дает мне строгие стандарты Создание объекта по умолчанию из пустого значения

protected function model($model)
{
    $path = "features". DS ."models". DS . $model .".php";
    require $path;

    $class = 'Model'. ucfirst($model);
    $this->model->$model = new $class;
}

мы можем сделать так, чтобы оно как-то вписывалось в стандарты?

редактировать *

эта функция находится в классе Application, поэтому я могу расширить их из нашего контроллера например blog Extends Application, затем вызовите что-то вроде $ this-> model-> blog и получите что-то вроде того, что я делаю выше, когда я сделаю что-то вроде

protected function model($model)
{
    $path = "features". DS ."models". DS . $model .".php";
    require $path;

    $class = 'Model'. ucfirst($model);
    $this->$model = new $class;
}

да, вышеприведенный код работает нормально $this->blog->getSomething();, но почему-то я хочу сделать их в группе, как вопрос выше, поэтому, если мы хотим получить что-то вроде $this->model->blog->getSomething();

Спасибо за время.

Адам Рамадан

Ответы [ 5 ]

7 голосов
/ 01 февраля 2011

Трудно понять, что вы на самом деле делаете неправильно с одним только этим кодом. Я сделал очень простой код для воспроизведения ошибки:

<?php
$bar = 42;
$foo = null;

$foo->bar = $bar;

Причина, по которой оно выдает это предупреждение, заключается в том, что вы присваиваете значения «путям объекта», но назначаете их переменной, которая не является объектом. Делая это, движок Zend фактически создает объект для $ foo, который является экземпляром StdClass. Очевидно, что 9 из 10 раз это не то, что вы хотите сделать, поэтому PHP предоставляет полезное сообщение.

В вашем случае: $ this-> model не является объектом (пока). Если вы хотите избавиться от ошибки, просто выполните:

if( !is_object( $this->model ) ) {
    $this->model = new StdClass;
}
$this->model->$model = new $class;

Приветствие.

2 голосов
/ 01 февраля 2011

Вы должны использовать __get магический метод - http://php.net/manual/pl/language.oop5.magic.php

Вы можете достичь того, что ищете, делая что-то подобное:

<?php
class ModelCreator
{
    private $_modelsCreated = array();
    public function __get($model)
    {
        $class = 'Model'. ucfirst($model);
        //avoid creating multiple same models
        if (!array_key_exists($model, $this->_modelsCreated)) {
            $path = "features". DS ."models". DS . $model .".php";
            require_once 'modeluser.php';
            $this->_modelsCreated[$class] = new $class;
        }
        return $this->_modelsCreated[$class];
    }
}

class MyClass
{
    private $_model;

    public function __construct(ModelCreator $model)
    {
        $this->_model = $model;
    }

    public function __get($name) 
    {
        if ($name === 'model') {
            return $this->_model;
        }
    }
}  

$myClass = new MyClass(new ModelCreator());
$userModel = $myClass->model->user; // will return a class of ModelUser

Но вы должны избегать магии, как описано выше -> лучший способ сделать это следующим образом:

//model creator is an instance of model creator
$this->modelCreator->getModel('user'); // now you know what exactly is happening
0 голосов
/ 04 июня 2019
if( !is_object( $this->request ) ) {
        $this->request = new StdClass;
    }
    if(!property_exists($this->request, 'method')) {
        $this->request->method = new StdClass;
    }
    // How is this request being made? POST, DELETE, GET, PUT?
    $this->request->method = $this->_detect_method();
0 голосов
/ 17 февраля 2013

В дополнение к ответу Берри Лангерак ​​

is_object по-прежнему будет запускать строгую проверку , поскольку предполагается, что в модели $ this-> есть «что-то». Исеть - лучший подход

if( !isset( $this->model ) ) {
    $this->model = new StdClass;
}

$this->model->$model = new $class;
0 голосов
/ 01 февраля 2011

Должен использовать двойной $ 's

$this->model->$$model = new $class;
...