ベースファイルからクラスフィールドを使用する外部ファイルを含むPHP

クラスがあるとしましょう...

class A {
private $action;
private $includes;

public function __construct($action, $file) {
//assign fields
}

public function includeFile()
    include_once($this->file);
}

$a = new A('foo.process.php', 'somefile.php');
$a->includeFile();

ご覧のように、includeFile()はインクルードを within 関数から呼び出すので、外部ファイルがインクルードされると、技術的には私の理解から関数内にあるはずです。

これを行った後、 somefile.php のようなフィールドを呼び出すファイルを見てみましょう。

<form action=<?=$this->action;?> method="post" name="someForm">
<!--moar markup here-->
</form>

これをやろうとすると、エラーが発生します。しかし、JoomlaのようなCMSでは、これはいつも達成されています。これはどのように可能ですか?

更新

ここに私が得るエラーがあります。

Fatal error: Using $this when not in object context in /var/www/form/form.process.php on line 8

更新2

ここに私のコードです:

class EditForm implements ISave{

    private $formName;
    private $adData;
    private $photoData;
    private $urlData;
    private $includes;

    public function __construct(AdData $adData, PhotoData $photoData, UrlData $urlData, $includes) {
            $this->formName = 'pageOne';
        $this->adData = $adData;
        $this->photoData = $photoData;
        $this->urlData = $urlData;
        $this->includes = $includes;
    }

    public function saveData() {
        $this->adData->saveData();
        $this->photoData->saveData();
    }

    public function includeFiles() {
        if (is_array($this->includes)) {
            foreach($this->includes as $file) {
                include_once($file);
            }
        } else {
            include_once($this->includes);
        }
    }

    public function populateCategories($parent) {

        $categories = $this->getCategories($parent);

        $this->printCategories($categories);

        }

    public function populateCountries() {

        $countries = $this->getCountries();

        $this->printCountries($countries);

    }

    public function populateSubCategories() {
        //TODO
    }

    private function getCategories($parent) {

        $db = patentionConnect();

        $query = 
        "SELECT * FROM `jos_adsmanager_categories` 
        WHERE `parent` = :parent";

        $result = $db->fetchAll(
            $query,
            array(
                new PQO(':parent', $parent)
            )
        );

        return $result;
    }

    private function getCountries() {
        $db = patentionConnect();

        $query = 
        "SELECT `fieldtitle` FROM `jos_adsmanager_field_values` 
        WHERE fieldid = :id";

        $result = $db->fetchAll(
            $query,
            array(
                new PQO(':id', 29)
            )
        );

        return $result;
    }

    private function printCountries(array $countries) { 
        foreach($countries as $row) {
            ?>
            
            <?php
        }
    }

    private function printCategories(array $categories) {
        foreach($categories as $key => $row){
            ?>
            
            <?php       
        }
    }


}

インクルード・コール(同じファイルに存在する):

$template = new EditForm(
    new AdData(),
    new PhotoData(),
    new UrlData($Itemid),
    array(
        'form.php', 
        'form.process.php'
    )
);

$template->includeFiles();

そして、含まれているメインファイル...

if ($this->formName == "pageOne") {

    $this->adData->addData('category', $_POST['category']);
    $this->adData->addData('subcategory', $_POST['subcategory']);

} else if ($this->formName == "pageTwo") {

    $this->adData->addData('ad_Website', $_POST['ad_Website']);
    $this->adData->addData('ad_Patent', $_POST['ad_Patent']);
    $this->adData->addData('ad_Address', $_POST['ad_Address']);
    $this->adData->addData('email', $_POST['email']);
    $this->adData->addData('hide_email', $_POST['hide_email']);
    $this->adData->addData('ad_phone', $_POST['ad_phone']);
    $this->adData->addData('ad_Protection', $_POST['ad_Protection']);
    $this->adData->addData('ad_Number', $_POST['ad_Number']);
    $this->adData->addData('ad_Country', $_POST['ad_Country']);
    $this->adData->addData('ad_issuedate', $_POST['issuedate'] . '/' . $_POST['issuemonth'] . '/' . $_POST['issueyear']);

} else if ($this->formName == "pageThree") {

    $this->adData->addData('name', $_POST['name']);
    $this->adData->addData('ad_Background', $_POST['ad_Background']);
    $this->adData->addData('ad_opeartion', $_POST['ad_operation']);
    $this->adData->addData('ad_advlimit', $_POST['ad_advlimit']);
    $this->adData->addData('ad_status', $_POST['ad_status']);
    $this->adData->addData('ad_addinfo', $_POST['ad_addinfo']);
    $this->adData->addData('ad_description', $_POST['ad_description']);
    $this->adData->addData('tags', $_POST['tags']);
    $this->adData->addData('videolink', $_POST['videolink']);

} else if ($this->formName == "pageFour") {

    foreach($_POST['jos_photos'] as $photo) {
        $this->photoData->addData(
            array(
                'title' => $photo['title'],
                'url' => $photo['url'],
                'ad_id' => $this->photoData->__get('ad_id'),
                'userid' => $this->photoData->__get('userid')
            )
        );
    }

}
3
どうぞ。ありがとうございます。
追加された 著者 zeboidlund,
OPは質問を解決したようです(下記の答えに見られるように)。あまりにもローカライズされたものとしてこれを閉じるための投票。
追加された 著者 maček,
あなたのエラーを投稿してください...ありがとう!
追加された 著者 Matt,

2 答え

更新

奇妙なこと:エラー自体は問題の内容とはまったく関係していませんでしたが、実装されていなかった未定義のフィールドであることがわかりました。

このスレッドを解決したと考えてください。答えた人には、私は確かにそれに感謝します。

1
追加された

これはうまくいくはずです。クラスの一部である非静的メソッド(例ではクラスA)から include を実行してもよろしいですか?あなたはあなたが使用している正確なコードを投稿できますか?

編集:このような問題の一般的なアドバイスとして、誰かが簡単にコピー/ペーストして正確なエラーを再現できる簡単な例で問題を再現できるように、コードをトリミングできるかどうかを確認してください。時間の大部分は、単純化しようとする過程であなた自身が答えを見つけます。そうしないと、他の人がデバッグを手助けするのがずっと楽になります。

1
追加された
ここでは、私は自分のコードを投稿した。ありがとうございました...
追加された 著者 zeboidlund,
申し訳ありませんが、私はそれを追加するのを忘れました。それは呼ばれている。すぐに投稿します - クラスと同じファイル内で呼び出されます。
追加された 著者 zeboidlund,
includeFiles()関数はそのコードのどこでも呼び出されていません...
追加された 著者 Russell Davis,
form.phpは $ this を使用していますか?ファイルがエラーなしでインクルードされているようで、form.phpまたはform.process.phpの先頭に何か問題があると思われます。
追加された 著者 Russell Davis,
短く、シンプルで完全な復習ケースが本当に助けになるでしょう。私の更新された答えを見てください。
追加された 著者 Russell Davis,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com