2016-05-01 13 views
0

私はresults.phpと2つのクラスを持っています.Petクラスを拡張するDogです。 "fullDescription"メソッド呼び出しは結果に対してnullを返すだけです(例: "Description:あなたのペットは名前付きです")。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> 

ペットクラス

<?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); 
    } 
} 
?> 

犬クラス

<?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(); 
01あなたはクラス Petprivate properitiesにアクセスしようとしている

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

。さらに、setterメソッドを使用してプロパティ値を代入しませんでした。 解決方法は次のようになります。

クラスのプロパティは、その子クラスまたは親クラスの外部にあるprivateプロパティにはアクセスできません。まずprotectedプロパティとして宣言:

class Pet 
{ 

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

    // your code 

} 

、その後results.phpページで、次のようにこれらの行に変更:privateにあなたのプロパティを設定したあなたのPetクラスで

// 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

OPが$ myPet-> name = $ petName;のような代入を行っていたときにプライベートプロパティがサブクラスにアクセスできないので、彼はクラス 'Dog'自体に新しい_public_プロパティを作成していたことに気付くでしょう。親クラスの 'name'プロパティが保護されていた場合、「保護されたプロパティにアクセスできません」という致命的なエラーが発生しました。 –

+0

@ダーラーあなたは正しいです。私はyuorの説明から$ myPet->記述子を理解しました。アプリケーションから呼び出されたときに値を返し、クラスメソッドから何も返さない - https://eval.in/563116 – splash58

+0

@DarraghEnright you'right。子クラスから 'private'プロパティにアクセスすることはできないので、すべてのプロパティは子クラスからアクセスできるように' protected'宣言する必要があります。良いキャッチ。 :-) –

0

をこれは、それらが設定されたクラス内からを公開して(アプリケーション内から)、のみを操作できないことを意味します(Petこの場合)。その理由は何ですか?

publicにそれらを設定します。

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

ここOOP visibilityのマニュアルがあります。 公開,の保護,プライベートの違いについて説明します。

関連する問題