-1

MVCのようなシステムを作成しています。
ビューファイルを呼び出したいときに、以下のクラスを使用しています。編集: その間、彼はこれを行うことができます: http://www.youtube.com/watch?feature=player_detailpage&v=Aw28-krO7ZM#t=1166s

<?php 
class Call{    
    function __construct($fileName) {
        //$this->db = new Database;
        self::callFile($fileName);
    }

    function callFile($fileName)
    {
        $this->title = "example";
        $this->description = "example";
        $this->keywords = "example";
        $fileName = $fileName . '.php';
        require PAGESPATH.'common/header.php';
        require PAGESPATH.$fileName;
        require PAGESPATH.'common/footer.php';
    }
}
?>

$fileName は index.php です。Index.php は

Index Page..

以下のように header.php にデータを出力したい:

<html>
    <head>
        <meta charset="utf-8">
    <title><?php if(isset($this->title)){echo $this->title;} ?> - WebProgramlama.tk</title>
    <meta name="description" content="<?php if(isset($this->description)){echo $this->description;}?>" />
    <meta name="keywords" content="<?php if(isset($this->keywords)){echo $this->keywords;} ?>" />
   </head>
   <body>

しかし、私はエラーが発生しています。

Fatal error: Using $this when not in object context in /var/www/webprogramlama/class/pages/common/header.php on line 4

この問題を解決するにはどうすればよいですか? 注:ご注意ください!header.php は Call クラスで呼び出しています。header.php は Call クラスの中にあります。

編集:なぜこれが実行されているのですか?

4

3 に答える 3

3

そのばかげた「チュートリアル」を見るのをやめてください。ある時点で実際に笑い始めたのはとても悪いことです。

これまでの経験なしに言語を習得して、高レベルの概念を使い始めることはできません。MVC はそのような概念の 1 つです。それを実際に把握するには、オブジェクト指向プログラミングとそれに関連する多くの原則を理解する必要があります。

.. などなど。記事を読んだだけでは、これらの原則を理解することはできません。

問題を解決する方法については、この記事をお読みください。テンプレートの使い方を説明します。これは実際にあなたの「mvcチュートリアル」が実際にあるものです-ルーティングメカニズムとテンプレートを作成するための悪いガイドです。

self::something();また、行う場合は対象外であることを理解しておく必要があります。クラスで静的メソッドを呼び出していますが、これは実際には手続き型プログラミングの貧弱な方法です。

PHP での OOPの基礎を学ぶことから始めるべきです。そして、あなた自身のためにも、少なくとも 1 年間は MVC やフレームワークから離れてください。

于 2012-08-16T03:29:56.763 に答える
2

要素をクラス外で呼び出す代わりに、$this->title次のようにコード内でオブジェクトの新しいインスタンスを作成する必要があります。

$callObject= new call($filename);

次に、次のようにページで参照します。

$callObject->title;

$this->クラス自体の内部でのみコードを使用できます。それ以外の場所では、オブジェクトを作成する必要があるため$this存在しません - そのクラスのオブジェクトは存在します - そして、その名前でそれを参照する必要があります。同時に、変数が呼び出される場合、クラス$callObjectでそのように変数を参照することはできません-その時点では変数のインスタンスを作成していないため、構文を介して参照する必要がありますこれは良い言い方です。$thismy element called title

編集:わかりました、あなたが今何をしているのかわかりました。

header.php ファイルには、 class というクラス内でのみ機能するものが多数含まれているため、これはかなり危険です。他のすべての状況では恐ろしいエラーが生成されます。

PHP ではheader.phpファイルをそのまま使用できますが、PHP は内容をそのまま評価するため、オブジェクトは不完全です。この質問を読んで、その部分にさらに詳しく答える必要があります。

編集 2: 関数をファイル間で分割しないでください。

内部のコードが関数内でのみheader.php使用されるように記述されている場合 (そのように思われます)、その内容全体をクラス内にコピーします。その場で貼り付けるためにorを使用しないでください。requireinclude

クラスに複数のファイルを持たないでください。ファイルの長さは関係ありません。

編集3:

ヘッダー セクションのコードは次のようになります。

<?php 
class Call{    
    function __construct($fileName) {
    //$this->db = new Database;
    self::callFile($fileName);
    }

    function callFile($fileName)
    {
    $this->title = "example";
    $this->description = "example";
    $this->keywords = "example";
    $fileName = $fileName . '.php';
    echo "
<html>
    <head>
    <meta charset='utf-8'>
    <title>        
    ";
    echo (isset($this->title)) ? $this->title : "";
    echo "
 - WebProgramlama.tk</title>
    <meta name='description' content='
    ";
    echo (isset($this->description)) ? $this->description : "";
    echo "' />
    <meta name='keywords' content='
    ";
    echo (isset($this->contents)) ? $this->contents : "";
    echo "
' />
   </head>
   <body>
    ";

    //require PAGESPATH.$fileName;
    //require PAGESPATH.'common/footer.php';
    // you can only include files that don't use any $this-> type elements.
    }
}
?>
于 2012-08-15T23:43:45.547 に答える
1

$thisクラス外のコンテキストはありません。クラスのインスタンスを作成し、代わりにそれを使用します。

<html>
    <head>
        <meta charset="utf-8">
<?php
    $class = new Call('filename');
?>    
    <title><?php if(isset($class->title)){echo $class->title;} ?> - WebProgramlama.tk</title>
    <meta name="description" content="<?php if(isset($class->description)){echo $class->description;}?>" />
    <meta name="keywords" content="<?php if(isset($class->keywords)){echo $class->keywords;} ?>" />
   </head>
   <body>

関数内のrequireステートメントを取り除きます。callFile彼らはそこにいる場所がありません。

于 2012-08-15T23:43:37.053 に答える