php의 대상을 깊이 있게 분석하다

예전에는 대상을 향해 억지로 외우는 것에 한정되었는데, 이렇게 오래 일했는데, 돌이켜보면 또 한 번 깨달음을 얻어 모두에게 보여 주었다.1.finalfinal:php5에final 키워드가 추가되었습니다.부모 클래스의 방법이final로 선언되면 하위 클래스는 이 방법을 덮어쓸 수 없습니다.만약 한 종류가final로 성명된다면, 계승될 수 없습니다..

class BaseClass{
     public function test(){
          ehco "test";
     }

     final public function moreTest(){
          echo "moretest";
     }
}

class ChildClass extends BaseClass{
     public function moreTest(){
          echo "moretest";
     }
}
// Fatal error: Cannot override final method BaseClass::moretest()
2.__toString(PHP5.2 이상 권장)

class Person{
     protected $name;
     protected $email;

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

     public function setEmail($email){
          $this->email = $email;
     }

     public function __toString(){
          return "$this->name <$this->email>";
     }
}
$rasums = new Person;
$rasums->setName('test');
$rasums->setEmail('[email protected]');
print $rasums;
3.인터페이스와 추상적인 인터페이스의 역할: 하나의 클래스가 특정한 명칭, 가시성과 원형에 따라 하나 이상의 방법을 실현하는 것을 보증하고 싶습니다.인터페이스의 요구: 클래스 중 모두 추상적 방법 추상적 방법 돈은 abstract 인터페이스 추상적 방법 속성을 추가하지 않고public 구성원 속성은 반드시 상량예:

interface ChildTest{
     public function childTest();
}
class FathTest implements ChildTest1,ChildTest2{
     public function childTest(){
          echo 1;
     }
     …………
}
추상적인 작용: 사실 추상류와 인터페이스류의 일부분은 매우 비슷하다. 어디서 이런 말을 보았는지 기억한다. 추상류는 유형의 부분을 추출한다. 이 문장은 매우 웃긴다. 사실 추상류의 진리를 말한다. 추상류의 작용은 당신이 여러 가지 유형 중에서 많은 방법을 사용하고 있다는 것을 보여주면 추상류를 사용하는 것을 고려할 수 있다.너는 아마도'나는 하나의 클래스를 다시 쓸 수 있는 것이 아니라 모든 공공 클래스를 실례화하여 하나의 공공 클래스를 사용하고 같은 방법을 호출하면 된다'고 말할 수 있다. 여기는 할 수 있다. 실제로 추상적인 클래스가 하는 일은 바로 이것이다. 그러나 그는 네가 실례화된 이 절차를 생략하여 너로 하여금 직접 이 클래스를 호출하는 것처럼 편리하게 하고 너는 이 방법을 다시 불러올 수 있다.추상적인 요구: 클래스 중 적어도 하나의 추상적인 방법이 있다. 추상적인 방법은 돈이 abstract 예를 넣어야 한다

abstract class Database{
     abstract public function connect();
     abstract public function query();
     abstract public function fetch();
     abstract public function close();
}
주: 추상적인 방법은 사유적인 방법으로 정의할 수 없고 최종적인 방법으로 정의할 수 없다. 왜냐하면 그들은 계승되어야 하기 때문이다.4. 전달 대상 인용 php4: 모든'='는 하나의 복사본을 만듭니다. php5: 대상을 제외하고 다른'='는 값을 부여할 때 하나의 복사본을 만듭니다.대상은 인용 5.클론 객체 1, 컬렉션 클래스:__call 방법 소개: 클라이언트 코드가 클래스에 정의되지 않은 방법을 사용할 때 __콜이 호출됩니다. __call () 은 두 개의 매개 변수를 수락합니다. 하나는 방법 이름이고, 다른 하나는 호출할 방법에 전달될 모든 매개 변수 (수조 포함) _call () 메서드가 반환하는 모든 값은 고객에게 반환됩니다. 호출 방식이 실제로 존재하는 것과 같은 예입니다

class Address{
     protected $city;
     protected $country;

     public function setCity($city){$this->city = $city;}
     public function getCity(){return $this->city;}
     public function setCountry($country){$this->country = $country;}
     public function getCountry(){return $this->country;}
}

class Person{
     protected $name;
     protected $address;
     //
     public function __construct(){
          $this->address = new Address;
     }

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

     public function __call($method,$arguments){
          if(method_exists($this->address,$method)){
               return call_user_func_array(array($this->address,$method),$arguments);
          }
     }
     //
     public function __clone(){
          $this->address = clone $this->address;
     }
}

$test1 = new Person;
$test2 = clone $test1;

$test1->setName('testname1');
$test1->setCity('testcity1');
$test2->setName('testname2');
$test2->setCity('testcity2');

echo $test1->getName().'-'.$test1->getCity()."
";
echo $test2->getName().'-'.$test2->getCity()."
";
//testname1-testcity2
//testname2-testcity2

6.중요 속성 액세스(__set _get __isset __unset)__isset __unset5.1 이후에야 유용: 속성에 대한 수요를 차단하고 분리의 정도를 높이기 위해 __isset () 및 __unset (), 우리가 isset으로 속성을 검출하거나 unset () 로 속성을 삭제함으로써 클래스의 행동이 올바른 예시를 보장합니다

class Person{
     protected $__data = array('email','test');

     public function __get($property){
          if(isset($this->__data[$property])){
               return $this->__data[$property];
          }else{
               return false;
          }
     }

     public function __set($property,$value){
          if(isset($this->__data[$property])){
               return $this->__data[$property] = $value;
          }else{
               return false;
          }
     }

     public function __isset($property){
          if(isset($this->__data[$property])){
               return true;
          }else{
               return false;
          }
     }

     public function __unset($property){
          if(isset($this->__data[$property])){
               return unset($this->__data[$property]);
          }else{
               return false;
          }
     }
}

$test = new Person;
$test->email= 'test';
var_dump($test->email);

주의: 이 두 가지 방법은 부족한 속성만 포착할 수 있습니다. 클래스에 속성을 정의하면 이 속성에 접근할 때 php는 __를 호출하지 않습니다.get () 및 __set();이 두 가지 방법은 어떤 속성 계승의 생각도 완전히 파괴했다.상위 객체에 __ 이 있는 경우get () 방법, 그리고 당신은 하위 클래스에서 자신의 __를 실현했습니다get () 메서드, 그러면 객체가 올바르게 실행되지 않습니다. 상위 클래스의 __get () 방법은 영원히 호출되지 않습니다. 물론 parent::_get () 단점 해결: 속도가 상대적으로 느리다. 마술 접근기 방법을 사용하면 반사 클래스를 사용할 수 없다. 예를 들어 phpdocumentor 같은 도구는 코드를 자동으로 문서화하여 정적 속성에 사용할 수 없다

좋은 웹페이지 즐겨찾기