Computer >> 컴퓨터 >  >> 프로그램 작성 >> PHP

PHP 가시성 모드

<시간/>

소개

PHP에서는 class를 사용하여 사용자 정의 복합 데이터 유형을 가질 수 있습니다. 예어. 클래스의 새 인스턴스는 개체입니다. 개체의 특성은 속성, 상수 및 메서드 멤버를 포함할 수 있는 클래스 정의에 따릅니다.

클래스 멤버의 접근성(가시성이라고도 함)은 해당 정의에 첨부된 가시성 접두사 키워드에 따라 다릅니다. PHP에는 세 가지 가시성 키워드(공개)가 있습니다. , 비공개보호 . public 키워드로 선언된 클래스 멤버는 어디에서나 접근할 수 있습니다. 보호된 멤버는 해당 클래스 내에서 그리고 클래스를 상속하여 액세스할 수 있습니다. 반면에 private 멤버는 정의된 동일한 클래스에서만 액세스할 수 있으며 외부에서는 볼 수 없습니다.

재산 가시성

속성은 클래스 인스턴스의 속성입니다. 인스턴스 속성(객체마다 다른 값을 가짐) 또는 각 객체에 대해 동일한 값을 갖는 클래스 속성일 수 있습니다. 속성은 모든 유효한 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;
?>

출력

다음 출력은 public 속성이 클래스 외부에서 액세스할 수 있음을 보여 주는 반면 private 및 protected 속성은 잡히지 않는 오류를 발생시킵니다.

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

그러나 private 및 protected 속성은 같은 클래스의 함수 내부에서 사용할 수 있습니다.

예시

<?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();
?>
로 호출되는 private 및 protected 메소드

출력

그러면 다음과 같은 결과가 생성됩니다. -

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

상속의 메서드 가시성

부모 자식에서 클래스 메서드를 재정의할 수 있습니다. 클래스 정의. 부모의 private 및 protected 메서드는 자식 클래스의 개체에 사용할 수 없습니다. 부모에서 보호되는 메서드는 자식 클래스 메서드에서 사용할 수 있습니다.

예시

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