PHP/Laravel magic,这是如何工作的?

PHP/Laravel magic,这是如何工作的?,php,laravel,Php,Laravel,我正在查看Laravel文档,我看到了以下片段: class UserController extends BaseController { /** * The layout that should be used for responses. */ protected $layout = 'layouts.master'; /** * Show the user profile. */ public function

我正在查看Laravel文档,我看到了以下片段:

class UserController extends BaseController {

    /**
     * The layout that should be used for responses.
     */
    protected $layout = 'layouts.master';

    /**
     * Show the user profile.
     */
    public function showProfile()
    {
        $this->layout->content = View::make('user.profile');
    }

}
我们可以清楚地看到$this->layout='layouts.master'。然而,他们定义了layout对象的子对象(据我所知,它只是一个基本PHP字符串,没有名为content的字段,通过

$this->layout->content=View::make('user.profile');

  • 字符串如何定义名为content的字段

  • 当我将BaseController子类化并尝试为 $this->layout->content,为什么会出现以下错误:“尝试 分配非对象的属性“


  • 为什么不看看BaseController?看起来他们改变了布局


    为什么不看看BaseController呢?看起来他们改变了布局


    该代码段自身无法工作。可能是另一个类正在更改
    $layout
    (通过setter方法)或该代码段完全错误。链接到找到该代码段的文档?这是他所指的文档。该代码段自身无法工作。或者是另一个类正在更改
    $layout
    (通过setter方法)或者代码片段完全错了。链接到你找到这个的文档?这是他所指的文档。+1表示“检查其来源”和“糟糕的设计”。我不会走到糟糕的设计。乍一看,这很混乱,但这是一个非常简单的修复方法。您可以将受保护的$layout='layouts.master';更改为受保护的$view='layouts.master';并检查setupLayout中的视图是否不为null。如果他们很难更改此设置,对我来说糟糕的设计将是。@mschuett,是的,您可以更改它,这可能是一个很好的设计(至少更好)。但事实上,它是一个已发布的框架,设计和记录的方式令人困惑。但我们只是在争论“设计”的定义,我想我们都同意应该有所不同。我的主要语言是Java,这种事情是不允许的。对我来说,这似乎是糟糕的设计。+1表示“检查其源代码”和“糟糕的设计”。我不会走到糟糕的设计。乍一看,这很混乱,但这是一个非常简单的修复方法。您可以将受保护的$layout='layouts.master';更改为受保护的$view='layouts.master';并检查setupLayout中的视图是否不为null。如果他们很难更改此设置,对我来说糟糕的设计将是。@mschuett,是的,您可以更改它,这可能是一个很好的设计(至少更好)。但事实上,它是一个已发布的框架,设计和记录的方式令人困惑。但我们只是在争论“设计”的定义,我想我们都同意应该有所不同。我的主要语言是Java,这类东西是不允许的。对我来说,这似乎是糟糕的设计。
    <?php
    
    class BaseController extends Controller {
    
        /**
         * Setup the layout used by the controller.
         *
         * @return void
         */
        protected function setupLayout()
        {
            if ( ! is_null($this->layout))
            {
                $this->layout = View::make($this->layout);
            }
        }
    
    }