LoginSignup
0
0

More than 5 years have passed since last update.

phpのpublic・private・protectを理解しよう!

Posted at

あれ?なんでNULLになるんだ??

データベースからデータを引っ張る関数を叩いてるのに、なぜかNULL…
var_dumpするとちゃんと引っ張れてるみたいだけど…
ん?private??
なんじゃこりゃ???

classにはアクセス修飾子がある。

・どこからでもアクセス可能なpublic
・class内部からしかアクセス出来ないprivate
・継承された子のclassと親のclassしかアクセス出来ないprotected
の3つがあります。
それぞれ適切に宣言することで
間違った動作を弾き、安全性を高めることが出来ます。

public

きっとclassを学び始めたボーイアンドガールは見慣れたアクセス装飾子。

class oyakurasu{
  public $kotoba = 'たいへんなんじゃよ';
}

$oya = new oyakurasu();

echo $oya->kotoba; //たいへんなんじゃよ

$oya->kotoba = 'やっぱかんたん';

echo $oya->kotoba; //やっぱかんたん

var_dump($oya); //object(oyakurasu)#1 (1) { ["kotoba"]=> string(21) "やっぱかんたん" }

こんな感じでclassの外部から
アクセスして書き換えたり読み取ったり出来ます。

private

privateはclassの内部でしかアクセス出来なくなるアクセス装飾子です。
例えばclassの中で完結する処理はprivateにすると
後でへんに変更を加えられないので安全性が高まります。

class oyakurasu{
  private $kotoba = 'たいへんなんじゃよ';
}

$oya = new oyakurasu();

echo $oya->kotoba; //Fatal error: Uncaught Error: Cannot access private property

$oya->kotoba = 'やっぱかんたん'; //Fatal error: Uncaught Error: Cannot access private property

echo $oya->kotoba; //Fatal error: Uncaught Error: Cannot access private property

var_dump($oya); //object(oyakurasu)#1 (1) { ["kotoba":"oyakurasu":private]=> string(27) "たいへんなんじゃよ" }

こんな感じで外部からアクセスしようとするとFatal errorprivateプロパティは外部からアクセス出来ませんと怒られます。

protected

protectedは宣言されたclass内部と
そのclassを継承した子classの内部でしかアクセス出来なくなるアクセス装飾子です。
privateと同様にclass外部からはアクセス出来ません。

class oyakurasu{
  protected $kotoba = 'たいへんなんじゃよ';
}

class kokurasu extends oyakurasu{
    public function hatugen(){
        return $this->kotoba;
    }

    public function omoidasu(){
        $this->kotoba = 'やっぱかんたん';
    }
}

$ko = new kokurasu();

echo $ko->hatugen(); //たいへんなんじゃよ

$ko->omoidasu();

echo $ko->hatugen(); //やっぱかんたん

echo $ko->kotoba; //Fatal error: Uncaught Error: Cannot access protected property

$ko->kotoba = 'でもきつい';//Fatal error: Uncaught Error: Cannot access protected property

var_dump($ko); //object(kokurasu)#1 (1) { ["kotoba":protected]=> string(21) "やっぱかんたん" }

こんな感じでkokurasu内ではprotectedの$kotobaはアクセスして書き換えたり読み替えたり出来ますが
classの外部からはアクセス出来ません。

でも外部からprivateやprotectedにアクセスしたい…

そんなワガママボディをもったマダムのご要望にお答えしましょう。
privateやprotectedな部分に干渉するpublicな関数を作れば良いのです。

class oyakurasu{
  private $kotoba = 'たいへんなんじゃよ';

  public function yomitori(){
      return $this->kotoba;
  }

  public function kakikomi($text){
      $this->kotoba = $text;
  }
}

$oya = new oyakurasu();

echo $oya->kotoba;  //atal error: Uncaught Error: Cannot access private property

$oya->kotoba = 'やっぱかんたん'; //atal error: Uncaught Error: Cannot access private property

echo $oya->yomitori();  //たいへんなんじゃよ

$oya->kakikomi('でもきつい');

echo $oya->yomitori();  //でもきつい


var_dump($oya); //object(oyakurasu)#1 (1) { ["kotoba":"oyakurasu":private]=> string(15) "でもきつい" }

こうすれば
実質外部からアクセスしてない
実質内部からアクセスしてる
からprivateやprotectedへの干渉が出来ます。

編集後記

入社13日目
すでに存在しているclassからデータを引っ張る際に困ったのでまとめました。
入社してから、ソースコードの修正ばかりやっているのでこういうテクニックが身についていきます。
と同時にあやふやにしてた部分も身につくので
やっぱ人のソースコード弄るのってレベルアップになります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0