Могу ли я сделать так, чтобы метод класса включал для меня файл заголовка в PHP? - PullRequest
3 голосов
/ 17 января 2010

Пожалуйста, ознакомьтесь с примером кода ниже, у меня есть файл класса, который загружается в файл конфигурации. Затем файл конфигурации загружается на любую страницу, которую я создаю. Можно ли включить заголовочный файл, как у меня в методе show_header ()? Кажется, это не работает, так как я могу достичь этого результата?

// Core.class.php
class Core
{

    public function show_header($page_name){
        require_once 'includes/header.inc.php';
    }

}

// config.inc.php
require_once 'Core.class.php';
$core = New core;



// testpage.php
require_once 'config.inc.php';
$core->show_header('home');

Вот верхняя часть файла header.inc.php, который я пытаюсь включить на страницу, он, кажется, работает, включая его, но нарушает работу файла заголовка.

//header.inc.php
<?PHP

//start page timer
$session->get('user_id');
$profiler = new Profiler;
$profiler->start();


//see if site is turned on/off
$core->sitestatus($config['site_status']); 

Эта часть дает мне такие ошибки ...

Примечание: неопределенная переменная: сессия в C: \ вебсервер \ HTDOCS \ friendproject2 \ включает \ header.inc.php по линии 5

Неустранимая ошибка: вызов функции-члена get () для необъекта в C: \ вебсервер \ HTDOCS \ friendproject2 \ включает \ header.inc.php по линии 5

Ответы [ 5 ]

2 голосов
/ 17 января 2010

Когда вы включаете файл из функции, это как если бы вы написали код в этом файле из этой функции.

, например

файл foo.php:

<?php
echo $foo->getFoo();

файл bar.php

<?php
class Foo {
    public function getFoo() {return 'foo';}
}

$foo = new Foo();

function bar()
{
    require 'foo.php';
}
bar();

Приведенное выше приведёт к выдаче следующего уведомления / ошибки, так как $ foo неизвестно в bar ().

Fatal error: Call to a member function getFoo() on a non-object in /Users/hobodave/foo.php on line 3

Edit:

Я не уверен, что полностью подразумевает ваш класс "Core", но вы, возможно, могли бы использовать его как тип хранилища для ваших "глобалов".

например.

<?php
$session = new Session();
$core->session = $session;

Тогда ваш $ session будет доступен в вашем заголовке, используя $ this-> session

1 голос
/ 17 января 2010

Ваш комментарий звучит так, как будто вам нужен корневой объект веб-контекста, из которого вы ссылаетесь на другие объекты:

$ctx = WebContext::get();
$ctx->session->get('x');
$ctx->input->get('y');
$ctx->identity->valid;

и т.д ... вот как это делают большинство веб-фреймворков.

$ сеанс должен быть определен, а затем указан во включенном файле:

// If a global variable:
global $session;
$session->get('x');

// If a member of Core:
$this->session->get('x');

да, вы можете сделать это, вероятно, вы захотите require вместо require_once, и пути должны основываться на текущем рабочем каталоге или абсолютном пути

попробуйте добавить error_reporting (E_ALL), чтобы увидеть, происходят ли какие-либо уведомления ...

0 голосов
/ 17 января 2010

Вы пытаетесь получить доступ к $ session, который находится вне области видимости, как указано в другом ответе.

Поскольку материал сеанса обычно является глобальным во всех приложениях, рассмотрите возможность использования шаблона синглтона для класса Session.

Таким образом, вы можете сделать что-то вроде $ session = Session :: getInstance ().

Это позволяет вам использовать класс сеанса где угодно, и вам обычно нужен только один экземпляр класса сеанса (обычно). Взгляните на Zend Framework для примеров одноэлементных классов.

0 голосов
/ 17 января 2010

Если вы используете статическую функцию для класса сеанса, вам не нужно определять ее в том же файле. http://php.net/manual/en/language.oop5.static.php

0 голосов
/ 17 января 2010

Все вызовы, которые вы делаете внутри файла заголовка, будут вызываться так, как если бы они были локальными вызовами внутри функции show_header. Поэтому, если вы хотите использовать любую глобальную переменную, вам придется использовать global $variablename; в верхней части включаемого файла (или в начале функции show_header).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...