2016-03-31 18 views
1

I次のコードを持っている:インスタンスとPHP OOPはプライベート保護

<?php 
    class Person{ 
     var $name; 
     public $height; 
     protected $socialInsurance = "yes"; 
     private $pinnNumber = 12345; 

     public function __construct($personsName){ 
      $this->name = $personsName; 
     } 

     public function setName($newName){ 
      $this->name = $newName; 
     } 

     public function getName(){ 
      return $this->name; 
     } 

     public function sayIt(){ 
      return $this->pinnNumber; 
     } 
    } 

    class Employee extends Person{ 
    } 

そして一部: クラス定義を

<!DOCTYPE html> 
<HTML> 
    <HEAD> 
     <META charset="UTF-8" /> 
     <TITLE>Public, private and protected variables</TITLE> 
    </HEAD> 
    <BODY> 
     <?php 
      require_once("classes/person.php"); 

      $Stefan = new Person("Stefan Mischook"); 

      echo("Stefan's full name: " . $Stefan->getName() . ".<BR />"); 

      echo("Tell me private stuff: " . $Stefan->sayIt() . "<BR />"); 


      $Jake = new Employee("Jake Hull"); 

      echo("Jake's full name: " . $Jake->getName() . ".<BR />"); 

      echo("Tell me private stuff: " . $Jake->sayIt() . "<BR />"); 

     ?> 
    </BODY> 
</HTML> 

出力:

Stefan's full name: Stefan Mischook. 
Tell me private stuff: 12345 
Jake's full name: Jake Hull. 
Tell me private stuff: 12345 // Here I was expecting an error 

私は理解しているように、 private変数はそれ自身のクラスからのみアクセス可能であり、protected変数はfrクラスを拡張するクラス私はプライベート変数$pinnNumberを持っています。だから私は$Jake->sayIt()と呼ぶとエラーが出ると思った。 $Jakeclass Employeeのメンバーであるため、class Personに拡張されています。変数$pinnNumberは、class Employeeからではなく、class Personからのみアクセス可能である必要があります。

問題はどこですか?

+1

あなたはクラスの従業員に '$ pinnNumber'にアクセスしている:あなたはsayIt()メソッドを拡張していなかったとして 、何の「アクセシビリティの問題」あなたはこのような何かをした場合、1があるでしょうがありませんか? 'sayIt()'にアクセスしています。これはpublicなので、呼び出し可能です。 – Daan

+1

'Employee'は' Person'から継承されました。 'Employee'は** private **変数に直接アクセスしませんでした**。親クラスから継承されたメソッドを使用し、その親クラスは変数にアクセスできます。したがって、それはすべて良いです。 – Mjh

+0

@Daan $ JackはEmployeeのメンバであるため、Personのすべてのプロパティを取ります。すべての関数、変数ですが、$ pinnNumberがprivateの場合、出力にどのように表示されますか。 –

答えて

4

実は、それはそれがどのように動作するかではありません。

<?php 
    class Person{ 
     var $name; 
     public $height; 
     protected $socialInsurance = "yes"; 
     private $pinnNumber = 12345; 

     public function __construct($personsName){ 
      $this->name = $personsName; 
     } 

     public function setName($newName){ 
      $this->name = $newName; 
     } 

     public function getName(){ 
      return $this->name; 
     } 

     public function sayIt(){ 
      return $this->pinnNumber; 
     } 
    } 

    class Employee extends Person{ 
     public function sayIt(){ 
      return $this->pinnNumber;//not accessible from child class 
     } 
    } 
-1

保護された、公開された、そして私的なものは、あなたのケースではクラスのための環境スコープに過ぎません。 satIt()の機能はpublicなので、その機能にアクセスして、適切な環境スコープを持ってprivateまたはprotectedの変数にアクセスできます。

あなたがしようとした場合は、次のクラスの外

$Jake->pinnNumber 

を、あなたはエラーを取得したいです。

あなたは、あなたが匿名関数の上に移動することができ、メソッドやクラスにスコープについてもっと研究しなければならない;)

+0

'this-> pinnNumber'を使って' Employee'の 'sayIt'を拡張し、エラーを取得しようとします。 –

+0

これは既に述べているので、私は答えにもっと多くを加えました..投票を説明してください – KDOT

+1

'sayIt'関数は子クラスでは拡張されておらず、アクセスが許可されていないので' pinnNumber'すべての変数に適用されます。 –

関連する問題