从php中的子对象范围内访问父对象变量

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了从php中的子对象范围内访问父对象变量脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我一直在研究模板引擎以及如何创建自己的简单模板引擎.从一个纯粹的学习角度来看,我读了几个像这样的 here.

使用上面链接中提到的类的一点修改版本,我想到测试它但遇到了问题.

当为内部HTML调用相同模板类的实例,然后将其作为VAR / value对分配给父实例时,我无法访问HTML(子对象)中的主要父变量.

混乱?

也许以下代码会有所帮助.

因此,如果我将模板设置为如此(模板类与上面链接中提到的模板类相同) –

$_page = new tplEngine();
$_page->load(TPLFILES_DIR . "/root.PHP");

然后将header.html实例化为tplEngine类的新实例,并分配
它作为第一个实例的变量如下 –

$_header = new tplEngineChild(TPLFILES_DIR . "/common/header.html");
$_page->set("header",$_header->parse());

哪里…

root.PHP
—————

<!DOCTYPE html>
<html>
    <head>
        <@L_406_10@ http-equiv="Content-type" content="text/html; charset=utf-8">
        <Meta http-equiv="X-UA-Compatible" content="IE=Edge" />
        <tITle><?PHP PRint $this->title; ?></title>
        <Meta name="keywords" content="<?PHP print $this->Meta_keywords; ?>" />
    <Meta name="description" content="<?PHP print $this->Meta_description; ?>" />
        <?PHP foreach($this->styles as $stylepath) : ?>
        <link rel="stylesheet" type="text/css" href="<?PHP print $stylepath; ?>" />
        <?PHP enDForeach; ?>
    </head>
    <body>
        <div class="body-wrap">
            <div class="header">
                <?PHP print $this->header; ?>
            </div>
            <div class="content-wrap">
                <?PHP var_dump($this->;mid_content); ?>
            </div>
            <div class="footer">
                <?PHP print $this->footer; ?>
            </div>
        </div>
    </body>
</html>

了header.html
—————–

<div class="mainHeader">
    <div class="logo">
        weBTrack.in'
    </div>
    <div class="dashboard">

        <?PHP if($this->get(isLOGgedIn) == false) : ?>
        <p class="greeting">Hello <span class="username"><?PHP echo this->username; ?></span></p>
        <a class="logout">logout</a>
        <?PHP else : ?>
        <p class="greeting">Hello <span class="username"><?PHP echo $this->username; ?></span></p>
        <p><a onclick="showLogin()">Login</a></p>
        <form id="loginForm" class="login form" action="" method="post">
            <input type="text" name="username" value="Username" />
            <input type="password" name="password" value="Password" />
        </form>
        <?PHP endif; ?>
    </div>
</div>
<nav>
    <ul class="headerNav">
        <li><a href="/">Home</a></li>
        <li><a href="/pricing">Plans and Pricing</a></li>
        <li><a href="/aboutUs">About Us</a></li>
    </ul>
</nav>

(在上面的例子中,$this-> get(isLoggedIn)和this-> username是分配给$_page实例的变量)
我遇到一个问题,在header.html文件中,我无法访问在tplEngine类的$_page实例下设置的变量.

解决这个问题的最佳方法是什么

当我在header.html中将$_page实例设置为全局时,一切正常.但这是一种正确的方法吗?

解决方法

关于对象继承

类是对象的模板,定义对象属性方法,而对象是类的实例.扩展类时,子类从父级继承属性方法.

在您的情况下,没有继承(父子关系),$_header作为单独的对象只是$_page的属性.要在这两个对象之间启用“通信”,$_header必须具有对$_page对象的引用.

模板类

这是您正在使用的Template类的修改版本.动态创建属性时,应使用__set()和__get()magic methods.它还使用__toString()方法,以便可以将模板对象视为字符串.模板文件使用的所有变量都应分配给模板对象.通过使用这样定义的类,可以同时呈现所有模板.

class tplEngine {
    private $template = '';

    public function __set( $var,$content )
    {
        $this->$var = $content;
    }

    public function __get( $var )
    {
        return ( isset($this->$var) ? $this->$var : null );
    }

    public function __construct( $template )
    {
        // is_readable() - tells whether a file exists and is readable
        if ( !is_readable( $template ) ) throw new IOException( "@L_126_50@ not find or access file: $template" );
        $this->template = $template;
    }

    public function __toString() 
    {
        ob_start();
        require ( $this->template );
        $content = ob_get_clean();
        return $content;
    }
}

// usage:
$_page = new tplEngine( TPLFILES_DIR . "/root.PHP" );

$_header = new tplEngine( TPLFILES_DIR . "/common/header.html" );
$_header->isLoggedIn = true;
$_header->username = 'some-username';

$_page->header = $_header;

// in root.PHP 
echo $this->header;

访问父变量

父母财产

在’parent’对象中访问变量的一种方法是通过构造函数将父属性添加到模板类:

public function __construct( $template,$parent = null )
{
    // is_readable() - tells whether a file exists and is readable
    if ( !is_readable( $template ) ) throw new IOException( "Could not find or access file: $template" );
    $this->template = $template;
    $this->_parent = $parent;
}

访问以下模板中的父属性

$this->_parent->username;

将父属性设为本地

另一种方法是让它们成为本地的(如果你不想打扰$this-> _parent调用那么巧妙的技巧):

public function __toString() 
{
    ob_start();
    if ( $this->_parent ) {
        foreach ( get_object_vars( $this->_parent ) as $key => $value ) $$key = $value;
    }
    require ( $this->template );
    $content = ob_get_clean();
    return $content;
}

附加信息

Adapter Design Pattern

PHP Overloading

Magic Methods

Smarty Template Engine – variable scopes

脚本宝典总结

以上是脚本宝典为你收集整理的从php中的子对象范围内访问父对象变量全部内容,希望文章能够帮你解决从php中的子对象范围内访问父对象变量所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。