Ben bir sınıf yöntemi PHP benim için bir başlık dosyası dahil olabilir?

5 Cevap php

Aşağıdaki örnek kodu gözden geçirin, ben bir yapılandırma dosyasına yüklenen bir sınıf dosyası var. Config dosyası sonra inşa herhangi bir sayfanın içine yüklenir. Bu bir başlık dosyasını ben show_header () yöntemi var yol eklemek için mümkün mü? Bu nasıl bu sonucu elde edebilirsiniz böylece çalışmak için görünmüyor?

// 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');

Burada sayfanın içine eklemek için çalışıyorum header.inc.php dosyanın üst kısmı olduğu, bunun da dahil olmak üzere iş gibi görünüyor ama o başlık dosyası çalışır bir şekilde kırar.

//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']); 

Bu bölüm bana böyle bir hata veriyor ...

Notice: Undefined variable: session in C:\webserver\htdocs\friendproject2\includes\header.inc.php on line 5

Fatal error: Call to a member function get() on a non-object in C:\webserver\htdocs\friendproject2\includes\header.inc.php on line 5

5 Cevap

Eğer gelen diğer nesnelere başvurmak bir kök web bağlam nesnesi gerekiyor gibi Yorumlarınız re, sesleri:

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

vs .. Bu çoğu web çerçeveleri bunu nasıl.

$ Session dahil dosyasında başvurulan sonra, tanımlanmış olması gerekir:

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

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

evet muhtemelen require_once istiyorum require yerine edeceğiz, bunu yapabilir, ve yolları mevcut çalışma dizini ya da mutlak bir yol dayalı olması gerekir

herhangi bir bildirim oluyor olmadığını görmek için error_reporting (E_ALL) eklemeyi deneyin ...

Eğer bir işlev içinde bir dosyayı dahil olduğunuzda bu o fonksiyon içinde o dosyanın içindeki kod yazdı, sadece sanki bulunuyor.

örneğin

foo.php dosyası:

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

dosya bar.php

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

$foo = new Foo();

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

Yukarıdaki $ foo (bar içinde bilinmediği için aşağıdaki bildirim / hata), savrulmasına neden olur.

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

Edit:

Ben senin "Çekirdek" sınıf tam ne demek emin değilim, ama belki "globalleri" için depolama türü olarak kullanabilirsiniz.

örneğin

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

Sonra $ session $ this-> oturumunu kullanarak başlığında erişilebilir olacak

Onlar show_header işlev içinde yerel aramalar sanki başlık dosyası içinde yaptığınız tüm aramalar çağrılır. Eğer herhangi bir global değişken kullanmak istiyorsanız Yani, global $variablename; dahil dosyanın üstüne (veya show_header fonksiyonunun başında) kullanmak zorunda olacak.

Eğer oturum sınıfı için statik bir işlevi kullanmak eğer aynı dosyada tanımlamak gerek olmazdı. http://php.net/manual/en/language.oop5.static.php

Siz başka bir yanıt işaret olarak kapsam dışında doları oturumu ulaşmaya çalışıyorsunuz.

Oturum şeyler çoğu uygulamalar Session sınıfı için singleton deseni kullanarak düşünün boyunca genellikle küresel beri.

Eğer $ session = Session :: getInstance () gibi bir şey yapabilirsiniz bu şekilde.

Bu her yerde oturum sınıfını kullanın ve genellikle sadece bir (genellikle) bir oturum sınıfının bir örneğini gerekir sağlar. Tekiz sınıfları örnekler için Zend Framework bir göz atın.