PHP не может найти файл класса - PullRequest
0 голосов
/ 25 октября 2011

Обычно я включаю свой файл класса перед созданием объекта.У меня вопрос, как я могу включить файл класса только в мой основной файл, а затем использовать его метод в другом классе?Вот мой код:

основной файл:

require_once("class.a.php");
require_once("class.b.php");

var $a;

function main () {
     $a = new class.a();
     $b = new class.b();
}

класс b:

 class b {
    var $a;

    function __construct() {
          $this->a = class.a::method();
    }          
 }

Кажется, это работает в некоторых старых версиях PHP, но выдает файл ошибкиclass.a.php не найден в некоторых новых версиях PHP.

Редактировать: я исправил свой вопрос: class.b использует прямые вызовы метода из class.a.Это дает мне ошибку class.a.php не найден.Я могу исправить эту ошибку, когда добавляю require_once ("class.a.php") в class.b.php следующим образом:

require_once("class.a.php");
class b {
    var $a;

    function _constructor() {
          $this->a = class.a::method();
    }          
 }

Но тогда у меня есть два включения, и это тоже не работаетс обновленной версией php?

Ответы [ 3 ]

3 голосов
/ 25 октября 2011

Ну, new class.a() должен создать синтаксическую ошибку, поскольку . не является допустимым оператором, кроме конкатенации строк. Вы хотите

class a {
    // do something
}

$a = new a();

Что касается require_once, хорошо, если вы включили или запросили файл в скрипте PHP, все классы / функции / переменные / константы / и т.д. будет продолжать сохраняться во всех других файлах, которые включены после требуемого. Так что ваша проблема здесь явно в синтаксической проблеме.

Кроме того, вы можете рассмотреть возможность изменения следующего:

  • var $a; устарел, он должен быть public $a (или защищенным или частным). var все еще действует, потому что он обратно совместим с PHP 4, но обычно это плохая идея.
  • Это __construct, а не _constructor
  • a::method(); означает «Вызов статического метода класса а». Вы хотите что-то вроде
    $this->a = new a(); $this->a->method();
2 голосов
/ 25 октября 2011

Вы должны НЕ иметь точки (.) в именах классов.

И вы можете рассмотреть возможность использования autoloader

1 голос
/ 25 октября 2011

Измените название ваших классов, как указано в других ответах. Сделайте их как «а» и «б». Вы должны использовать внедрение зависимости от класса b.

b {
    public $a;

    function __construct(a $a) {
        $this->a = $a; // now you have the instance of class.a in your class.b
   }          
}

И ваш main.php

require_once("class.a.php");
require_once("class.a.php");

function main () {
     $a = new a()
     $b = new b($a);
     $b->a->method(); // call the method of a
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...