Классовая Инстанция Сбой - PullRequest
1 голос
/ 21 января 2009

У меня возникли некоторые проблемы, из-за которых мой объект постепенно выходит из строя, если во время создания экземпляра задан неверный параметр. У меня такое ощущение, что это небольшая синтаксическая вещь, на которую мне просто нужны свежие глаза. Любая помощь приветствуется.

class bib {
   protected $bibid;
   public function __construct($new_bibid) {
      if(!$this->bibid = $this->validate_bibid($new_bibid)) {
        echo 'me';
        return false;
      }
      //carry on with other stuff if valid bibid
    }

    private static function validate_bibid($test_bibid) {
       //call this method every time you get a bibid from the user
       if(!is_int($test_bibid)) {
            return false;
       }
       return (int)$test_bibid;
    }
 }

Обратите внимание, что у меня есть строка 'echo me', чтобы продемонстрировать, что она на самом деле возвращает false. То, как я это называю в моем PHP, выглядит следующим образом:

if(!$bib=new bib('612e436')) {
    echo 'Error Message';
} else {
    //do what I intend to do with the object
}

Это выводит меня сверху, но затем продолжается в блок else, делая то, что я намерен делать с действительным объектом.

Может кто-нибудь заметить, что я там делаю неправильно?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 21 января 2009

Я вижу несколько проблем в этом коде.

  • Прежде всего, я думаю, что вы хотите сделать что-то вроде этого:

    $ myBib = new bib (); если ($ myBib-> validate_bibid ( '612e436')) {..два вещи ..}

    (или что-то подобное)

    помните, что __construct не является нормальным методом. Это конструктор, и он не должен ничего возвращать. Это уже неявно возвращает ссылку на новый экземпляр, который вы сделали.

  • Во-вторых, ваш validate_bibid возвращает либо логическое, либо целое число. С этим проблем не возникнет сразу, но лично мне стиль не нравится.

  • В-третьих, вы объявили защищенного члена $ bibid, но нигде не устанавливаете и не ссылаетесь на него. Я ожидаю, что это будет установлено в конструкторе, например. После этого вы можете просто вызвать validate_bibid без каких-либо аргументов.

Этот кусок кода, очевидно, сбивает вас с толку, потому что он имеет некоторые странные конструкции и, следовательно, не ведет себя нормально. Я бы предложил переосмыслить и переписать этот кусок с нуля.

Обновление:

Другая проблема:

Я не думаю, что эта строка делает то, что вы думаете:

 if(!$this->bibid = $this->validate_bibid($new_bibid)) {

Вы, вероятно, имеете в виду это:

 if(!$this->bibid == $this->validate_bibid($new_bibid)) {

 // Or even better:

 if($this->bibid <> $this->validate_bibid($new_bibid)) {
1 голос
/ 21 января 2009

Вы не можете вернуться в конструктор в PHP - объект все еще создается как обычно.

Вы можете использовать фабрику или что-то подобное;

if(!$bib = Bib_Factory::loadValidBib('612e436')){
    echo 'Error Message';
} else {
    //do what I intend to do with the object
}

Или сгенерируйте исключение в конструкторе и используйте оператор try вместо оператора if.

0 голосов
/ 21 января 2009

определенно, вам нужно сравнить с == вместо =, что является операцией присваивания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...