0

我正在制作一个小的 PHP 函数,它将显示我数据库中所有管理员的头像。出于某种原因,当我尝试调用该函数时出现以下错误$backend->addSnippet('login: show-admins');。这是PHP类。

<?php

class zBackend {

private $adminCount;

final public function fetchAdminInfo() {
    global $zip, $db, $tpl;

    $query = $db->prepare('SELECT first_name, last_name FROM zip__admins');
    $query->execute();

    $result = $query->fetchAll();

    $id = 1;
    foreach($result as $row) {
        $tpl->define('admin: first_name-' . $id, $row['first_name']);
        $tpl->define('admin: last_name-' . $id, $row['last_name']);
        $id++;
    }
    $this->adminCount = $id;
}

final public function addSnippet($z) {
    global $tpl;

    if(isset($z) && !empty($z)) {
        $this->fetchAdminInfo();

        switch($z) {
            case 'login: show-admins':
                $tpl->write('<ul id="users">');

                $id = 0;
                while($this->adminCount > $id) {
                    $tpl->write('<li data-name="{admin: first_name-' . $id + 1 . '} {admin: last_name-' . $id + 1 . '}">');
                    $tpl->write('<div class="av-overlay"></div><img src="{site: backend}/img/avatars/nick.jpg" class="av">');
                    $tpl->write('<span class="av-tooltip">{admin: first_name-' . $id + 1 . '} {admin: last_name-' . $id + 1 . '}</span>');
                    $tpl->write('</li>');
                }

            break;
        }
    } else {
        return false;
    }
}
}
?>

这是我设置功能的地方:

final public function __construct() {
    global $zip, $core, $backend;

    $this->Define('site: title', $zip['Site']['Title']);
    $this->Define('site: location', $zip['Site']['Location']);
    $this->Define('site: style', $zip['Site']['Location'] . '/_zip/_templates/_frontend/' . $zip['Template']['Frontend']);
    $this->Define('site: backend', $zip['Site']['Location'] . '/_zip/_templates/_backend/' . $zip['Template']['Backend']);


    $this->Define('social: email', $zip['Social']['Email']);
    $this->Define('social: twitter', $zip['Social']['Twitter']);
    $this->Define('social: youtube', $zip['Social']['Youtube']);
    $this->Define('social: facebook', $zip['Social']['Facebook']);

    $this->Define('snippet: show-admins', $backend->addSnippet('login: show-admins'));
}

这里是我调用函数的地方:

<ul id="users">
  {snippet: show-admins}
  <br class="clear">
</ul>

这是我声明 $backend 的地方

<?php
session_start();

error_reporting(E_ALL);
ini_set('display_errors', '1');

define('D', DIRECTORY_SEPARATOR);
define('Z', '_zip' . D);
define('L', '_lib' . D);
define('C', '_class'. D);

require Z . 'config.php';
require Z . L . 'common.php';

try {
$db = new PDO($zip['Database']['Data']['Source']['Name'], $zip['Database']['Username'], $zip['Database']['Password']);
} catch(PDOException $e) {
die(zipError('ZipDB: Connection Failed', $e->getMessage()));
}

require Z . C . 'class.ztpl.php';
require Z . C . 'class.zcore.php';
require Z . C . 'class.zbackend.php';
require Z . C . 'class.zmail.php';

$tpl = new zTpl();
$backend = new zBackend();
$core = new zCore();
?>

如果我将代码放入文件中,它工作得很好,但这限制了我可以做的事情。我希望能够在一个类中做到这一点并使用函数来调用它。有任何想法吗?

4

1 回答 1

1

$backend当您的构造函数触发时未定义。从您发布的代码中不清楚您__construct正在构建什么类,但我猜它在 zTpl 中。考虑将您的代码片段定义调用移动到一个单独的方法,您可以在构造所有依赖对象后调用该方法。

在 zTpl 类中:

final public function __construct() {
    global $zip;  //note that we don't need $core or 
                  //$backend, since they aren't yet defined
                  //Personally, I would pass the $zip array
                  //as a parameter to this constructor.

    $this->Define('site: title', $zip['Site']['Title']);
    //...
}

public function defineShowAdminsSnippet($backend) {
    $this->Define('snippet: show-admins', $backend->addSnippet('login: show-admins'));
}

在哪里定义你的对象:

$tpl = new zTpl();
$backend = new zBackend();
$core = new zCore();
//new:
$tpl->defineShowAdminsSnippet();

global在我看来,如果你不使用关键字,就更容易避免这样的依赖问题。

于 2013-08-26T07:16:22.177 回答