찾다
백엔드 개발PHP 튜토리얼PHP 类与对象 全解析( 二)

目录

PHP 类与对象 全解析( 一)

PHP 类与对象 全解析( 二)

PHP 类与对象 全解析(三 )

7.Static关键字


声明类成员或方法为static,就可以不实例化类而直接访问。不能通过一个对象来访问其中的静态成员(静态方法除外)。

静态成员属于类,不属于任何对象实例,但类的对象实例都能共享。
小结:

在类内部访问静态成员属性或者方法,使用 self::(没有 $ 符号),如:
 self:: $country  //类内部访问静态成员属性
 self:: myCountry()
在子类访问父类静态成员属性或方法,使用 parent::(没有 $ 符号),如:
 parent:: $country
 parent:: myCountry()
外部访问静态成员属性和方法为 类名/子类名:: ,如:
 Person::$country
 Person::myCountry()
 Student::$country
但静态方法也可以通过普通对象的方式访问

    <?php            Class Person{          // 定义静态成员属性          public static $country = "中国";          // 定义静态成员方法          public static function myCountry() {              // 内部访问静态成员属性              echo "我是".self::$country."人<br />";          }      }      class Student extends Person {          function study() {              echo "我是". parent::$country."人<br />";          }      }      // 输出成员属性值      echo Person::$country."<br />";     // 输出:中国      $p1 = new Person();      //echo $p1->country;            // 错误写法      // 访问静态成员方法      Person::myCountry();            // 输出:我是中国人      // 静态方法也可通过对象访问:      $p1->myCountry();            // 子类中输出成员属性值      echo Student::$country."<br />";    // 输出:中国      $t1 = new Student();      $t1->study();           // 输出:我是中国人            ?>  

---------------------------------------------------

8.抽象类    PHP5支持抽象类和抽象方法。


      抽象类不能直接被实例化,你必须先继承该抽象类,然后再实例化子类。
      抽象类中 至少要包含一个抽象方法。如果类方法被声明为抽象的,那么其中就不能包括具体的功能实现。
      继承一个抽象类的时候,子类必须实现抽象类中的所有抽象方法;
      另外,这些方法的可见性 必须和抽象类中一样(或者更为宽松)。
      如果抽象类中某个抽象方法被声明为protected,那么子类中实现的方法就应该声明为protected或者public,而不 能定义为private。
      //抽象方法:abstract protected function getValue();
例子1

    abstract class AbstractClass{          // 定义抽象方法          abstract protected function getValue();          // 普通方法          public function printOut(){              print $this->getValue()."<br />";          }      }      class ConcreteClass extends AbstractClass{          protected function getValue(){              return "abstract ";//抽象方法的实现          }      }            $class1 = new ConcreteClass;      $class1->printOut();  

例子2

    abstract class AbstractClass      {       // 强制要求子类定义这些方法          abstract protected function getValue();          abstract protected function prefixValue($prefix);                // 普通方法(非抽象方法)          public function printOut() {              print $this->getValue() . "\n";          }      }            class ConcreteClass1 extends AbstractClass      {          protected function getValue() {              return "ConcreteClass1";          }                public function prefixValue($prefix) {              return "{$prefix}ConcreteClass1";          }      }            class ConcreteClass2 extends AbstractClass      {          public function getValue() {              return "ConcreteClass2";          }                public function prefixValue($prefix) {              return "{$prefix}ConcreteClass2";          }      }            $class1 = new ConcreteClass1;      $class1->printOut();      echo $class1->prefixValue('FOO_') ."\n";            $class2 = new ConcreteClass2;      $class2->printOut();      echo $class2->prefixValue('FOO_') ."\n";  

/*
 * 抽象类不能直接被实例化,你必须先继承该抽象类,然后再实例化子类。
      抽象类中 至少要包含一个抽象方法。如果类方法被声明为抽象的,那么其中就不能包括具体的功能实现。
      继承一个抽象类的时候,子类必须实现抽象类中的所有抽象方法;
      另外,这些方法的可见性 必须和抽象类中一样(或者更为宽松)。
      如果抽象类中某个抽象方法被声明为protected,那么子类中实现的方法就应该声明为protected或者public,而不 能定义为private。
 *
 */

    class Person {          public $name;          public $age;                function say() {              echo "my name is:".$this->name."<br />";          echo "my age is:".$this->age;          }      }  

// 类的继承

    class Student extends Person {          var $school;    //学生所在学校的属性                    function study() {              echo "my name is:".$this->name."<br />";              echo "my shool is:".$this->school;          }             }            $t1 = new Student();      $t1->name = "zhangsan";      $t1->school = "beijindaxue";      $t1->study();  

---------------------------------------------------------------------


9.接口


 接口定义:方法和常量值定义的集合
              通过interface来定义一个接口,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
   
 接口的特性:接口中定义的所有方法都必须是public
 
 接口的实现:一个接口可以使用implements操作符,类中必须实现接口中的所有方法,否则会报fatal错误,如果要实现多个接口,可以使用逗号来分隔多个接口的名称。

抽象类和接口的区别

接口是特殊的抽象类,也可以看做是一个模型的规范。接口与抽象类大致区别如下:

1.一个子类如果 implements 一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法即可。
2.如果一个接口中定义的方法名改变了,那么所有实现此接口的子类需要同步更新方法名;而抽象类中如果方法名改变了,其子类对应的方法名将不受影响,只是变成了一个新的方法而已(相对老的方法实现)。
3.抽象类只能单继承,当一个子类需要实现的功能需要继承自多个父类时,就必须使用接口。
实例1:
// 声明一个'iTemplate'接口

nterface iTemplate  {      public function setVariable($name, $var);      public function getHtml($template);  }  

// 实现接口
// 下面的写法是正确的

    class Template implements iTemplate      {          private $vars = array();                  public function setVariable($name, $var)          {              $this->vars[$name] = $var;          }                  public function getHtml($template)          {              foreach($this->vars as $name => $value) {                  $template = str_replace('{' . $name . '}', $value, $template);              }                     return $template;          }      }  

实例2:
//定义接口

    interface User{           function getDiscount();           function getUserType();       }  

//VIP用户 接口实现

    class VipUser implements User{          // VIP 用户折扣系数          private $discount = 0.8;          function getDiscount() {              return $this->discount;          }          function getUserType() {              return "VIP user";          }      }      class Goods{          var $price = 100;          var $vc;          //定义 User 接口类型参数,这时并不知道是什么用户          function run(User $vc){              $this->vc = $vc;              $discount = $this->vc->getDiscount();              $usertype = $this->vc->getUserType();              echo $usertype."goods Price:".$this->price*$discount;          }      }            display ->run(new VipUser);    //可以是更多其他用户类型  

-------------------------------------------------------------


10.重载


   定义:一个类中的方法与另一个方法名称相同,但参数不同
   什么情况下执行重载?  当调用当前的环境下未被定义的属性或者方法时,或者当调用当前环境下不可见的属性或方法。
  
提示:
 如果父类定义方法时使用了 final 关键字,则不允许被子类方法覆盖。

 访问父类被覆盖的方法
 可以通过parent:: 符号来访问父类被覆盖的方法或成员属性:
 //PHP 重载方法 __call()

 __call()(Method overloading)
为了避免当调用的方法不存在时产生错误,可以使用 __call() 方法来避免。该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去。

语法:
// __call()方法重载

    class Test{          public function __call($name,$args){           if($name== 'null' && count($args)==2 ){            $type='num';         foreach($args as $key => $val){             if(!(is_int($val) || is_float($val))){              $type= 'string';          }         }         $method=$name.ucfirst($type);         if(method_exists($this,$method),$args){             call_user_func_array(array($this,$method),$args);         }        }       }       public addNum($i,$j){           echo $i+$j;       }              public addString($i,$j){           echo $i.$j;       }      }      $test =new Test();      $test->add(3,4);      $test->add(3,'4');         

案例:

    class MemberTest {                      private $data = array();//被重载的数据保存在此            public $declared = 1;/**  重载不能被用在已经定义的属性  */          private $hidden = 2; /**  只有从类外部访问这个属性时,重载才会发生 */                public function __set($name, $value) {              echo "Setting '$name' to '$value'\n";              $this->data[$name] = $value;          }                public function __get($name) {              echo "Getting '$name'\n";              if (array_key_exists($name, $this->data)) {                  return $this->data[$name];              }                    $trace = debug_backtrace();              trigger_error(                  'Undefined property via __get(): ' . $name .                  ' in ' . $trace[0]['file'] .                  ' on line ' . $trace[0]['line'],                  E_USER_NOTICE);              return null;          }                /**  PHP 5.1.0之后版本 */          public function __isset($name) {              echo "Is '$name' set?\n";              return isset($this->data[$name]);          }                /**  PHP 5.1.0之后版本 */          public function __unset($name) {              echo "Unsetting '$name'\n";              unset($this->data[$name]);          }                /**  非魔术方法  */          public function getHidden() {              return $this->hidden;          }      }                  echo "<pre class="brush:php;toolbar:false">\n";            $obj = new MemberTest;            $obj->a = 1;      echo $obj->a . "\n\n";            var_dump(isset($obj->a));      unset($obj->a);      var_dump(isset($obj->a));      echo "\n";            echo $obj->declared . "\n\n";            echo "Let's experiment with the private property named 'hidden':\n";      echo "Privates are visible inside the class, so __get() not used...\n";      echo $obj->getHidden() . "\n";      echo "Privates not visible outside of class, so __get() is used...\n";      echo $obj->hidden . "\n";  

//属性重载:__set(),__get(),__isset(),__unset()

    class Person{          private $data =array();          function __set($name,$value){           $this->data[$name]=$value;       }       function __get($name){           return $this->data[$name];       }      }  

-----------------------------------------------------------------------------------


11.对象迭代


       PHP5提供了一种迭代(iteration)对象的功能,就像使用数组那样,可以通过foreach 来遍历对象中的属性

    class MyClass      {          public $var1 = 'value 1';          public $var2 = 'value 2';          public $var3 = 'value 3';                protected $protected = 'protected var';          private   $private   = 'private var';                function iterateVisible() {             echo "MyClass::iterateVisible:\n";             foreach($this as $key => $value) {                 print "$key => $value\n";             }          }      }            $class = new MyClass();            foreach($class as $key => $value) {          print "$key => $value\n";      }      echo "\n";                  $class->iterateVisible();  

---------------------------------------------------------------------------


12.设计模式: 工厂模式和 单例模式,    观察者模式,命令链模式和策略模式

 

 命令链 模式以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求。
如果可以,该请求被处理,进程停止。您可以为系统添加或移除处理程序,而不影响其他处理程序。


工厂模式
    定义:工厂模式(Factory)允许你在代码执行时实例化对象。它之所以被称为工厂模式是因为它负责“生产”对象。工厂方法的参数是你要生成的对象对应的类名称。
 
工厂模式语法:

    <?php      class Example      {          public static function factory($type)          {              if (include_once 'Drivers/' . $type . '.php') {                  $classname = 'Driver_' . $type;                  return new $classname;              } else {                  throw new Exception ('Driver not found');              }          }      }      ?>   

   工厂模式案例:

    <?php      interface IUser{       function getName();      }      class User implements IUser{       public function __construct($id){}       public function getName(){           return "haha";       }      }      class UserFactory{          public static function Create($id){        return new User($id);       }      }      $uo =UserFactory::Create(1);      echo $uo->getName();            ?>  

单例
   定义三要素:1,某个类只能有一个实例  2,必须自行创建这个实例  3,必须自行向系统提供这个实例
  
   作用: 1,如果系统中需要有一个类来全局控制某些配置信息,那么使用单例模式可以很方便的实现。
          2,使用单例模式,可以避免大量的new操作消耗资源()
          3在一个页面请求中,便于调试,因为所有的代码都集中在一个类中(如数据库操作类) 可以在类中设置钩子,输出日志,从而避免到处都是var_dump
    
单例模式(Singleton)用于为一个类生成一个唯一的对象。最常用的地方是数据库连接。 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
单件模式是我们在开发中经常用到的一种设计模式,利用PHP5面向对象的特性,我们可以很容易的构建单件模式的应用,下面是单件模式在PHP中的几种实现方法:

    class Stat{          static $instance = NULL;                    static function getInstance(){              if(self::$instance == NULL){                  self::$instance = new Stat();              }                            return self::$instance;          }              private function __construct(){          }              private function __clone(){          }                        function sayHi(){              return "The Class is saying hi to u ";          }      }                  echo Stat::getInstance()->sayHi();   

这是一种最通常的方式,在一个getInstance方法中返回唯一的类实例。

对这里例子稍加修改,便可以产生一个通用的方法,只要叫道任何你想用到单件的类里,就可以了。

    class Teacher{          function sayHi(){              return "The teacher smiling and said 'Hello '";          }                    static function getInstance(){              static $instance;                            if(!isset($instance)){                  $c = __CLASS__;                  $instance = new $c;              }                      return $instance;          }      }            echo Teacher::getInstance()->sayHi();   

最后一种是提供一个singleton类,然后通过调用getInstance方法,可以为任何一个类生产出一个实例来。

    class singleton{          function getInstance($class){              static $instances = array();              if(!array_key_exists($class,$instances)){                  $instances[$class] = &new $class;              }              $instance = $instances[$class];                            return $instance;          }      }            class People{          function sayHi(){              return 'Hello i am a people?';          }      }            echo "<br />";      echo singleton::getInstance('People')->sayHi();   

通过这三种方法,我们可以很容易的应用单件模式,如果能够结合工厂模式,将使我们的编程变得更有条理和效率。
---------------------------------------------------------------------------------------

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
PHP 실행 : 실제 예제 및 응용 프로그램PHP 실행 : 실제 예제 및 응용 프로그램Apr 14, 2025 am 12:19 AM

PHP는 전자 상거래, 컨텐츠 관리 시스템 및 API 개발에 널리 사용됩니다. 1) 전자 상거래 : 쇼핑 카트 기능 및 지불 처리에 사용됩니다. 2) 컨텐츠 관리 시스템 : 동적 컨텐츠 생성 및 사용자 관리에 사용됩니다. 3) API 개발 : 편안한 API 개발 및 API 보안에 사용됩니다. 성능 최적화 및 모범 사례를 통해 PHP 애플리케이션의 효율성과 유지 보수 성이 향상됩니다.

PHP : 대화식 웹 컨텐츠를 쉽게 만들 수 있습니다PHP : 대화식 웹 컨텐츠를 쉽게 만들 수 있습니다Apr 14, 2025 am 12:15 AM

PHP를 사용하면 대화식 웹 컨텐츠를 쉽게 만들 수 있습니다. 1) HTML을 포함하여 컨텐츠를 동적으로 생성하고 사용자 입력 또는 데이터베이스 데이터를 기반으로 실시간으로 표시합니다. 2) 프로세스 양식 제출 및 동적 출력을 생성하여 htmlspecialchars를 사용하여 XSS를 방지합니다. 3) MySQL을 사용하여 사용자 등록 시스템을 작성하고 Password_Hash 및 전처리 명세서를 사용하여 보안을 향상시킵니다. 이러한 기술을 마스터하면 웹 개발의 효율성이 향상됩니다.

PHP 및 Python : 두 가지 인기있는 프로그래밍 언어를 비교합니다PHP 및 Python : 두 가지 인기있는 프로그래밍 언어를 비교합니다Apr 14, 2025 am 12:13 AM

PHP와 Python은 각각 고유 한 장점이 있으며 프로젝트 요구 사항에 따라 선택합니다. 1.PHP는 웹 개발, 특히 웹 사이트의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 간결한 구문을 가진 데이터 과학, 기계 학습 및 인공 지능에 적합하며 초보자에게 적합합니다.

PHP의 지속적인 관련성 : 여전히 살아 있습니까?PHP의 지속적인 관련성 : 여전히 살아 있습니까?Apr 14, 2025 am 12:12 AM

PHP는 여전히 역동적이며 현대 프로그래밍 분야에서 여전히 중요한 위치를 차지하고 있습니다. 1) PHP의 단순성과 강력한 커뮤니티 지원으로 인해 웹 개발에 널리 사용됩니다. 2) 유연성과 안정성은 웹 양식, 데이터베이스 작업 및 파일 처리를 처리하는 데 탁월합니다. 3) PHP는 지속적으로 발전하고 최적화하며 초보자 및 숙련 된 개발자에게 적합합니다.

PHP의 현재 상태 : 웹 개발 동향을 살펴보십시오PHP의 현재 상태 : 웹 개발 동향을 살펴보십시오Apr 13, 2025 am 12:20 AM

PHP는 현대 웹 개발, 특히 컨텐츠 관리 및 전자 상거래 플랫폼에서 중요합니다. 1) PHP는 Laravel 및 Symfony와 같은 풍부한 생태계와 강력한 프레임 워크 지원을 가지고 있습니다. 2) Opcache 및 Nginx를 통해 성능 최적화를 달성 할 수 있습니다. 3) PHP8.0은 성능을 향상시키기 위해 JIT 컴파일러를 소개합니다. 4) 클라우드 네이티브 애플리케이션은 Docker 및 Kubernetes를 통해 배포되어 유연성과 확장 성을 향상시킵니다.

PHP 대 기타 언어 : 비교PHP 대 기타 언어 : 비교Apr 13, 2025 am 12:19 AM

PHP는 특히 빠른 개발 및 동적 컨텐츠를 처리하는 데 웹 개발에 적합하지만 데이터 과학 및 엔터프라이즈 수준의 애플리케이션에는 적합하지 않습니다. Python과 비교할 때 PHP는 웹 개발에 더 많은 장점이 있지만 데이터 과학 분야에서는 Python만큼 좋지 않습니다. Java와 비교할 때 PHP는 엔터프라이즈 레벨 애플리케이션에서 더 나빠지지만 웹 개발에서는 더 유연합니다. JavaScript와 비교할 때 PHP는 백엔드 개발에서 더 간결하지만 프론트 엔드 개발에서는 JavaScript만큼 좋지 않습니다.

PHP vs. Python : 핵심 기능 및 기능PHP vs. Python : 핵심 기능 및 기능Apr 13, 2025 am 12:16 AM

PHP와 Python은 각각 고유 한 장점이 있으며 다양한 시나리오에 적합합니다. 1.PHP는 웹 개발에 적합하며 내장 웹 서버 및 풍부한 기능 라이브러리를 제공합니다. 2. Python은 간결한 구문과 강력한 표준 라이브러리가있는 데이터 과학 및 기계 학습에 적합합니다. 선택할 때 프로젝트 요구 사항에 따라 결정해야합니다.

PHP : 웹 개발의 핵심 언어PHP : 웹 개발의 핵심 언어Apr 13, 2025 am 12:08 AM

PHP는 서버 측에서 널리 사용되는 스크립팅 언어이며 특히 웹 개발에 적합합니다. 1.PHP는 HTML을 포함하고 HTTP 요청 및 응답을 처리 할 수 ​​있으며 다양한 데이터베이스를 지원할 수 있습니다. 2.PHP는 강력한 커뮤니티 지원 및 오픈 소스 리소스를 통해 동적 웹 컨텐츠, 프로세스 양식 데이터, 액세스 데이터베이스 등을 생성하는 데 사용됩니다. 3. PHP는 해석 된 언어이며, 실행 프로세스에는 어휘 분석, 문법 분석, 편집 및 실행이 포함됩니다. 4. PHP는 사용자 등록 시스템과 같은 고급 응용 프로그램을 위해 MySQL과 결합 할 수 있습니다. 5. PHP를 디버깅 할 때 error_reporting () 및 var_dump ()와 같은 함수를 사용할 수 있습니다. 6. 캐싱 메커니즘을 사용하여 PHP 코드를 최적화하고 데이터베이스 쿼리를 최적화하며 내장 기능을 사용하십시오. 7

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경