2016-05-01 3 views
0

У меня есть results.php и 2 класса, Dog, который расширяет класс Pet. Вызов метода «fullDescription» просто возвращает значение null для результатов (например: «Описание: ваше домашнее животное - это имя.»)Расширения и объекты класса PHP

Что мне не хватает?

results.php:

<?php 
    //include('_includes/pet.class.php'); 
    include("_includes/dog.class.php"); 

?> 
<?php 

// COLLECT THE VALUES FROM THE FORM 
$petType = $_POST["petType"]; 
$petName = $_POST["petName"]; 

// CREATE A NEW INSTANCE OF THE CORRECT TYPE 
if ($petType == "dog") 
{ 
    $myPet = new Dog(); 
    $myPet->breed = Dog::randomBreed(); 
} 
else 
{ 
    $myPet = new Cat(); 
    $myPet->breed = randomBreed(); 
} 

// ASSIGN THE VALUE FROM THE FORM TO THE name PROPERTY OF THE PET OBJECT 
$myPet->name = $petName; 
$myPet->descriptor = Pet::randomDescriptor(); 
$myPet->color = Pet::randomColor(); 

?> 

<div class="basic-grey"> 

<h1>Here's the information about your pet:</h1> 

<p>Pet Name: <?php echo $myPet->name; ?></p> 
<p>Pet Name: <?php echo $myPet->breed; ?></p> 
<p>Pet Name: <?php echo $myPet->color; ?></p> 
<p>Pet Name: <?php echo $myPet->descriptor; ?></p> 
<p>Description: <?php echo $myPet->fullDescription(); ?> </p> 

Pet Class

<?php 

class Pet 
{ 

    // DEFINE YOUR CLASS PROPERTIES HERE 
    private $name; 
    private $descriptor; 
    private $color; 
    private $breed; 

    ///////// Getters Setters ///////// 
    public function setName($name) { 
     $this->name = $name; 
    } 
    public function getName() { 
     return $this->name; 
    } 

    public function setDescriptor($descriptor) { 
     $this->descriptor = $descriptor; 
    } 
    public function getDescriptor() { 
     return $this->descriptor; 
    } 

    public function setColor($color) { 
     $this->color = $color; 
    } 
    public function getColor() { 
     return $this->color; 
    } 

    public function setBreed($breed) { 
     $this->breed = $breed; 
    } 
    public function getBreed() { 
     return $this->breed; 
    } 

    // DEFINE YOUR METHODS HERE 
    public function fullDescription() 
    { 
     return "Your pet is a $this->descriptor $this->color $this->breed named $this->name."; 
     //echo $myPet->getName(); 
    } 

    public static function randomDescriptor() 
    { 
     // SET UP AN ARRAY OF VALUES 
     $input = array("stinky", "huge", "tiny", "lazy", "lovable"); 

     // RETURN A SINGLE RANDOM ELEMENT FROM THE ARRAY 
     return array_rand(array_flip($input), 1); 
    } 

    public static function randomColor() 
    { 
     // SET UP AN ARRAY OF VALUES 
     $input = array("tan", "brown", "black", "white", "spotted"); 

     // RETURN A SINGLE RANDOM ELEMENT FROM THE ARRAY 
     return array_rand(array_flip($input), 1); 
    } 
} 
?> 

Dog Класс

<?php 
include('pet.class.php'); 

//////////// DOG CLASS ////////////// 
class Dog extends Pet 
{public static function randomBreed() 
    { 
     // SET UP AN ARRAY OF VALUES 
     $input = array("german shepherd", "dachsund", "retriever", "labradoodle", "bulldog"); 

     // RETURN A SINGLE RANDOM ELEMENT FROM THE ARRAY 
     return array_rand(array_flip($input), 1); 
    } 

} 

?> 
+0

Где вы определяете класс 'Cat'? Возможно, настоящая проблема заключается в том, что она на самом деле никогда не называет 'new Dog()', а вместо этого вызывает 'else' вашего условия, что является' new Cat() '. –

ответ

1

Проблема в том, что следующие строки,

$myPet->breed = Dog::randomBreed(); 

и

$myPet->name = $petName; 
$myPet->descriptor = Pet::randomDescriptor(); 
$myPet->color = Pet::randomColor(); 

Вы пытаетесь получить доступ к private properities класса Pet. Кроме того, вы не присваивали значения свойств, используя методы setter. Решение было бы следующим:

Вы не можете получить доступ к private свойствам класса из его дочернего класса или вне родительского класса. Сначала объявить их как protected свойства:

class Pet 
{ 

    // DEFINE YOUR CLASS PROPERTIES HERE 
    protected $name; 
    protected $descriptor; 
    protected $color; 
    protected $breed; 

    // your code 

} 

, а затем на results.php изменения страницы эти строки в следующем виде:

// your code 

if ($petType == "dog") 
{ 
    $myPet = new Dog(); 
    $myPet->setBreed(Dog::randomBreed()); 
} 
else 
{ 
    $myPet = new Cat(); 
    $myPet->setBreed(Cat::randomBreed()); 
} 
$myPet->setName($petName); 
$myPet->setDescriptor(Pet::randomDescriptor()); 
$myPet->setColor(Pet::randomColor()); 
echo $myPet->fullDescription(); 
+1

Возможно, стоит отметить, что, поскольку частные свойства недоступны для подкласса, когда ОП выполнял назначения, такие как '$ myPet-> name = $ petName;' он создавал новые свойства _public_ на самом классе 'Dog'. Если свойство 'name' в родительском классе было защищено, он увидел бы фатальную ошибку« Невозможно получить доступ к защищенному свойству ». –

+0

@ DarraghEnright вы правы. я понял из объяснения yuor, почему $ myPet-> дескриптор; возвращает значение при вызове из приложения и ничего не возвращает из метода класса - https://eval.in/563116 – splash58

+0

@ DarraghEnright you'right. Поскольку свойства 'private' не могут быть доступны из дочернего класса, все свойства должны быть объявлены' protected', чтобы сделать их доступными из дочернего класса.Хороший улов. :-) –

0

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

Установите их public:

public $name; 
public $descriptor; 
public $color; 
public $breed; 

Вот руководство по OOP visibility. Обсуждает различия между общественностью, protected, частный.

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