gpt4 book ai didi

php - 了解 vars 的类和范围

转载 作者:搜寻专家 更新时间:2023-10-31 21:11:32 24 4
gpt4 key购买 nike

我正在重写很多我的旧代码,目前正在尝试掌握类、函数并围绕 MVC 模型松散地重建我的网站。

但是,我无法让我的 header 模板包含在内,以引用由我的主配置文件自动加载的用户帐户详细信息,我认为我错过了一个非常重要的步骤。

报错信息是Fatal error: call to member function is_loggedin() on a non-object...,所以我猜测在template.class.php中执行的include无法访问account.class.php 函数。

更新:在 header.tpl.php 中执行 var_dump(get_included_files()) 显示 account.class.php 和 template.class.php 都包含(按此顺序)。我还尝试在 header.tpl.php 的顶部手动包含 account.class.php 以查看它是否会产生任何影响......它没有。帮助:(

我还应该注意到,我可以毫无问题地从 index.php 调用 $_account->is_loggedin()。 Jst 不是来自包含的文件 header.inc.php。

很可能我会把这一切都弄错,所以如果有人可以提供一些指示,下面是我的代码的简化写法:

index.php

<php require 'defaults.php'; ?>
<html>
<head>
...
</head>
<body>
<?php $_template->load('header'); ?>
....
</body>

defaults.php

session_start();

// define path settings
// connect to database, memcache
// lots of other stuff....

//autoloader for functions
spl_autoload_register(function ($class) {
if (file_exists(CLASS_PATH.DS.$class.'.class.php'))
{
include CLASS_PATH.DS.$class.'.class.php';
}
});

$_account = new account(); // autoload user account stuff
$_template = new template(); // autoload templates

account.class.php

class account
{
private $db;

public function __construct($db) {
$this->db = $db;
}


public function is_loggedin() {
// do various session checks
}
}

template.class.php

class template
{
public function load($template)
{
if (file_exists(TPL_PATH.DS.$template.'.tpl.php'))
{
include TPL_PATH.DS.$template.'.tpl.php';
}
}
}

header.tpl.php

<div id="header">
<?php if($_account->is_loggedin() == true): ?>
<p>logged in</p>
<?php else: ?>
<p>not logged in</p>
<?php endif; ?>

最佳答案

您尝试访问的 $_account 是您的 template::load 方法函数范围内的一个变量,即 $_account 你初始化的是一个全局变量。

如果你想使用全局变量,你应该在函数中用 global $_account 声明它,或者使用 $GLOBALS['_account']

一个简单的模板示例(其余部分是从您的源代码中复制的):

Template.class.php:

interface IApiHandler {
public function printContent();
}

SomeTemplate.class.php:

class SomeTemplate implements Template {
public function printContent() {
$account = Account::getCurrent();
?>
<div id="header">
<?php if($account->is_loggedin() == true): ?>
<p>logged in</p>
<?php else: ?>
<p>not logged in</p>
<?php endif;
}
}

Account.class.php:

class Account {
private static $current = null;
public static function getCurrent() {
if(self::$current === null) {
self::$current = new Account();
}
return self::$current;
}
public function __construct() {
//account init...
}
public function isLoggedIn() {
return rand()%2;
}
}

defaults.php:

session_start();

// define path settings
// connect to database, memcache
// lots of other stuff....

//autoloader for functions
spl_autoload_register(function ($class) {
if (file_exists(CLASS_PATH.DS.$class.'.class.php'))
{
include CLASS_PATH.DS.$class.'.class.php';
}
});

$headerTemplate = new HeaderTemplate();//not included in the example...
$bodyTemplate = new SomeTemplate();

index.php

<php require 'defaults.php'; ?>
<html>
<head>
...
</head>
<body>
<?php $headerTemplate->printContent(); ?>
<?php $bodyTemplate->printContent(); ?>
</body>

还应注意,这缺少 MVC 中的 C。这只是如何将模板制作为类的示例。

通常索引(或在本例中为 default.php)只需要决定哪个 Controller 应该处理请求。然后 Controller 必须决定(或默认)应该使用哪个模板(如果有的话)。

另外,如果所有的 html 都包含在模板中会更好,在 Controller 处理请求之前不应打印任何输出。

关于php - 了解 vars 的类和范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18696664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com