2016-07-11 5 views
0

Для некоторых строковых вводов ($age) Я должен выводить обратно «вы молоды», «вы подросток» и «вы стары», зависит от введенного возраста.Классы ООП и пример

Проблема с этим, то, что кажется, что мой код не так или иначе, я в начале с OOP в PHP, поэтому если вы можете помочь мне с некоторыми пояснениями, я буду благодарно

<form action="classvsinstance.php" method="get"> 
    <input type="text" name="age" placeholder="age"> 
    <input type="submit" value="submit"> 
</form> 

и

class Person{ 
    public $age; 
    public function __construct($initialAge){ 
     // Add some more code to run some checks on initialAge 
     if($initialAge < 0){ 
      $age = 0; 
      print('Age is not valid, setting age to 0.'); 
     } else { 
      $initialAge = $age; 
     } 
    } 
    public function amIOld(){ 

     if($age < 13){ 
      print("You are young."); 
     }elseif(($age>=13) && ($age < 18)){ 
      print("You are a teenager."); 
     }else{ 
      print("You are old"); 

    } 
    public function yearPasses(){ 
     // Increment the age of the person in here 
     $age++; 
    } 


} 

$age = $_GET['age']; 
echo "Your age is " . $age . ".<br><br>"; 

инстанцировании класс

$p = new Person($age); 

вызова метода

$ -> amIOld(); 
echo "\n"; 

Все выходы для каждого числа я кладу в форме, являются «Вы молоды».

Я не знаю, почему, и что я делаю неправильно здесь, потому что я пробовал все пути (кроме хорошего).

+1

Внутри вашего класса используйте: '$ this-> age' вместо' $ age'! –

+1

В каждом из методов вашего класса вам нужно ссылаться на класс '$ age', а не на локальный экземпляр, вы делаете это с помощью' $ this-> age', который * не совпадает с * $ age' в каждом из ваши методы. '$ age' в' yearPasses' всегда будет 0 -> 1, потому что это значение забывается, как только эта функция/метод заканчивается. То же самое с 'amIOld()', вы не ссылаетесь на значение * class * '$ this-> age' – Martin

+1

Поскольку вы не сообщаете о получении ошибок« неопределенной переменной », вы, вероятно, работаете с display_errors и error_reporting отключены. Они никогда не должны отключать систему разработки/отладки. –

ответ

3

Ваша конструкция assiging вещи назад, это должно быть так:

public function __construct($initialAge){ 
     // Add some more code to run some checks on initialAge 
     if($initialAge < 0){ 
      $this->age = 0; 
      print('Age is not valid, setting age to 0.'); 
     } else { 
      $this->age = $initialAge; 
     } 
} 

Вы хотите быть назначая от $initialAge к переменной класса $age, а не наоборот. Затем вам необходимо обратиться к переменной класса с $this ключевого слова:

public function amIOld(){ 
     if($this->age < 13){ 
      print("You are young."); 
     }elseif(($this->age>=13) && ($this->age < 18)){ 
      print("You are a teenager."); 
     }else{ 
      print("You are old"); 
     } 
    //^closing brace was also missing! 
} 

public function yearPasses(){ 
     // Increment the age of the person in here 
     $this->age++; 
} 

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

+0

В этом была проблема, теперь я понимаю, как это работает. Спасибо ! –

Смежные вопросы