PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPの可視性モード


はじめに

PHPでは、クラスを使用してユーザー定義のcompundデータ型を持つことができます。 キーワード。クラスの新しいインスタンスはオブジェクトです。オブジェクトの特性はクラスの定義に従っており、プロパティ、定数、メソッドのメンバーが含まれている場合があります。

クラスメンバーのアクセシビリティ(可視性とも呼ばれます)は、その定義に付加された可視性プレフィックスキーワードによって異なります。 PHPには3つの可視性キーワードがあります-publicプライベート および保護 。 publicキーワードで宣言されたクラスメンバーは、anywhareからアクセスできます。保護されたメンバーは、そのクラス内から、およびクラスを継承することによってアクセスできます。一方、プライベートメンバーには、それが定義されているのと同じクラスからのみアクセスでき、外部のメンバーには表示されません。

プロパティの可視性

プロパティは、クラスインスタンスの属性です。これは、インスタンスプロパティ(オブジェクトごとに異なる値を持つ)またはオブジェクトごとに同じ値を持つクラスプロパティである可能性があります。プロパティは、任意の有効なPHPデータ型にすることができます。プロパティは、デフォルトで公開されています。プロパティがvarキーワード(現在は非推奨)を使用して定義されている場合、そのプロパティはパブリックとして扱われます。

<?php
class myclass{
   public $fname="Ajay";
   var $lname; //treated as public
   private $marks=100;
   protected $age=20;
}
$obj=new myclass();
echo "$obj->fname\n";
$obj->lname="Diwan";
echo "$obj->marks\n";
$obj->age=21;
?>

出力

次の出力は、パブリックプロパティはクラス外でアクセスでき、プライベートプロパティと保護されたプロパティはキャッチされないエラーをスローすることを示しています

Ajay
PHP Fatal error: Uncaught Error: Cannot access private property myclass::$marks
PHP Fatal error: Uncaught Error: Cannot access protected property myclass::$age

ただし、プライベートプロパティと保護プロパティは同じクラスの関数内で使用できます

<?php
class myclass{
   public $fname="Ajay";
   var $lname;
   private $marks=100;
   protected $age=20;
   function displaydata(){
      $this->lname="Diwan";
      echo "$this->fname $this->lname\n";
      echo "marks=$this->marks age=$this->age";
   }
}
$obj=new myclass();
$obj->displaydata();
?>

出力

これにより、次の結果が得られます。 −

Ajay Diwan
marks=100 age=20

メソッドの可視性

クラスプロパティと同様に、クラスメソッドにもpublic、private、およびprotectedキーワードを使用して可視性を割り当てることができます。メソッドも、デフォルトではパブリックとして扱われます。

<?php
class myclass{
   public $fname="Ajay";
   var $lname;
   private $marks=100;
   protected $age=20;
   public function setname(){
      $this->fname="Anil";
      $this->lname="Dave";
      echo "name changed\n";
   }
   private function setmarks(){
      $this->marks=90;
   }
   protected function setage(){
      $this->age=21;
   }
   function setdata(){
      $this->setname();
      $this->setmarks();
      $this->setage();
   }
   function displaydata(){
      $this->lname="Diwan";
      echo "$this->fname $this->lname\n";
      echo "marks=$this->marks age=$this->age";
   }
}
$obj=new myclass();
$obj->setname();//works
$obj->setmarks();//error
$obj->setage();/error
$obj->setdata(); //private and protected methods called withing public method
$obj->displaydata();
?>
で呼び出されるプライベートメソッドと保護メソッド

出力

これにより、次の結果が得られます。 −

name changed
PHP Fatal error: Uncaught Error: Call to private method myclass::setmarks() from context ''
PHP Fatal error: Uncaught Error: Call to protected method myclass::setage() from context ''
Anil Dave
marks=90 age=21

継承におけるメソッドの可視性

クラスメソッドはでオーバーライドできます クラス定義。親のプライベートメソッドと保護されたメソッドは、子クラスのオブジェクトには使用できません。ただし、親で保護されているメソッドは、子クラスのメソッドで使用できます

<?php
class testclass{
   public $x=10;
   private $y=20;
   protected $z=30;
   private function test(){
      echo "testclass private method\n";
   }
   public function test1(){
      echo "testclass public method\n";
   }
   protected function test2(){
      echo "testclass protected method\n";
   }
   function test3(){
      echo "x=$this->x y=$this->y z=$this->z\n";
   }
}
class newclass extends testclass{
   function test1(){
      echo "newclass public method\n";
   }
   public function test4(){
      $this->test();
      $this->test1();
      $this->test2();
   }
}
$obj=new newclass();
echo $obj->test1();
echo $obj->test3();
echo $obj->test4();
?>

出力

次の結果が表示されます

newclass public method
x=10 y=20 z=30
PHP Fatal error: Uncaught Error: Call to private method testclass::test() from context 'newclass'

一定の可視性

PHP 7.1以降では、可視性モードを定数で使用できるようになりました。定数のデフォルトの可視性はパブリックです

<?php
class testclass{
   public const X=10;
   private const Y=20;
   protected const Z=30;
   function showconst(){
      echo "x=" . self::X ;
      echo "y=" . self::Y;
      echo "z=" . self::Z ;
   }
}
$obj=new testclass();
$obj->showconst();
echo testclass::Y . "\n";
echo testclass::Z . "\n";
?>

出力

次の結果が表示されます

x=10y=20z=30
PHP Fatal error: Uncaught Error: Cannot access private const testclass::Y
PHP Fatal error: Uncaught Error: Cannot access protected const testclass::Z

  1. PHPのclass_exists()関数

    PHPのclass_exists()関数は、クラスが定義されているかどうかをチェックします。クラスが定義済みクラスの場合はTRUEを返し、そうでない場合はFALSEを返します。 構文 class_exists(class, autoload) パラメータ クラス −クラスの名前。 自動読み込み −デフォルトで__autoloadを呼び出すかどうか 戻る class_exists()関数は、クラスが定義されたクラスの場合はTRUEを返し、そうでない場合はFALSEを返します。 例 以下は例です- <?php if (class_exists('Demo'

  2. C#の静的クラス

    C#静的クラスはインスタンス化できず、静的メンバーのみを持つことができます。 C#の静的クラスは封印されており、インスタンスコンストラクターを含めることはできません。 以下は、静的クラスと静的メンバーの例です- 例 using System; public static class Demo {    public static float PI = 3.14f;    public static int calc(int n){return n*n;} } class Program {    public static v