PHP, включая внешние файлы, которые используют поля класса из базового файла - PullRequest
3 голосов
/ 25 ноября 2011

Допустим, у меня есть класс ...

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 () вызывает функцию include из в функции, следовательно, после включения внешнего файла, технически это должно быть внутри функции, насколько я понимаю.

После того, как я это сделал, давайте посмотрим на включенный файл, который somefile.php, который вызывает поле следующим образом.

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

Когда я пытаюсь это сделать, я получаю сообщение об ошибке.Тем не менее, в CMS, такой как Joomla, я вижу, что это выполняется постоянно.Как это возможно?

Обновление

Вот ошибка, которую я получаю.

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) {
            ?>
            <option value=<?=$row['fieldtitle'];?> >
                <?=$row['fieldtitle'];?>
            </option>
            <?php
        }
    }

    private function printCategories(array $categories) {
        foreach($categories as $key => $row){
            ?>
            <option value=<?=$row['id'];?>>
                <?=$row['name'];?>
            </option>
            <?php       
        }
    }


}

И вызов include (который существует в том же файле):

$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')
            )
        );
    }

}

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Обновление

Странно: хотя сама ошибка не была вполне связана с проблемой, я обнаружил, что это просто неопределенное поле, котороеЯ не реализовал.

Считайте эту тему решенной.Тем, кто ответил, я, конечно, ценю это.

1 голос
/ 25 ноября 2011

Это должно работать. Вы уверены, что делаете include из нестатического метода, который является частью класса (класс A в вашем примере)? Можете ли вы опубликовать точный код, который вы используете?

Редактировать: В качестве общего совета для подобных проблем, посмотрите, можете ли вы урезать код, чтобы проблема воспроизводилась в коротком, простом примере, который любой мог легко скопировать / вставить для воспроизведения точной ошибки. В большинстве случаев вы сами найдете ответ в процессе упрощения. И если вы этого не сделаете, другим будет намного легче помочь вам отладить.

...