あれ?なんで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 error
でprivateプロパティは外部からアクセス出来ません
と怒られます。
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からデータを引っ張る際に困ったのでまとめました。
入社してから、ソースコードの修正ばかりやっているのでこういうテクニックが身についていきます。
と同時にあやふやにしてた部分も身につくので
やっぱ人のソースコード弄るのってレベルアップになります。