zoukankan      html  css  js  c++  java
  • php 面向对象

    js面向对象:

        类:具有相同特征的一些对象的集合;

        对象:具体某一个事物了,都可以叫对象;

      类:通过function定义的类,所以js里类的本质为函数;

      类的标志:首字母大写(函数名 )  函数内部使用this  调用函数使用new关键字;

      1.类和函数天生有prototype和__proto__两个属性,prototype又是一个对象,天生有一个constructor的属性,属性值函数或类本身;

      2.普通对象:天生有一个__proto__的属性,这个属性又是一个对象,指向他的父类;

      引用关系:

      fn.prototype.init=function(){}

      fn.prototype={ init:function(){} }

      他们的区别?

        前者不会改变原有引用关系,后者会改变原有的引用关系;

      注意:每个变量只能有一个地址

      拷贝:浅拷贝,深拷贝;

      php的面向对象;

      类的创建:class创建;

        class Person{}

      对象的创建:使用new关键字:

        $p:new Person();       (如果里面没有参数,可以不加括号);

      成员的添加:需要3个修饰符:public  protected  private

      public:定义公共的属性,任何地方都可以使用,类的外部,类的内部,子类(公共)

      protected:定义受保护的属性和方法,只能在类的内部和子类使用(受保护)

      private:定义私有的属性和方法,只能在自身的类使用(私有)

      案例:

        public $word="hello world";   (解析:定义公共的变量word)

      方法成员的前面如果不加修饰符,默认为public;

      成员的调用: 需要使用->符号;

        $p->fn()    (使用成员的属性和方法的时候,属性和方法前面不带$符)

     特殊对象:$this 指向实例化的对象;

      案例:

      class person{

        public $name="lisi";        //(php每个语句后面一定要加;)

        function fn(){

          echo $this->name;    //通过->调用属性和方法;

        }

      $s=new Person;

      $s->fn();

      }

      如果类的方法里想用类的其他属性和方法,需要使用$this对象;

      构造方法:__construct()  构造函数在实例化的时候,系统会自动调用;

      析构的方法:__destruct()  我们每次new实例化,系统都会给这个对象分一个内存空间,如果不销毁,系统的压力很大,所以系统有一个析构的方法__destruct()  实例化之后,系统会自动调用;

      内存销毁的原则:先进后出;

      案例:构造和析构联合使用

      class Person{

        public $name;

        //构造的方法;

        function __construct($par){

          $this->name=$par

        }

        //析构的方法;

        function __destruct(){

          echo $this->name;

        }

      }

      $p=new Person("zhang");

      最后输出zhang  翻译为 函数传参使$name="zhang";  使用完毕后,会销毁内存;  析构会直接输出   无需调用;

      成员的赋值

      $p->name=456;

      echo $p->name;  单独赋值的方法;

      注意:对象中的方法不会展开var_dump() 不能用这个展开对象;

      继承的关键字:extends  

      class Child extends Person{}

      $c=new Child;

      var_dump($c)  这样继承所有属性  但是方法却看不见 

      范围的修饰符  ::

      常量的使用const的关键字定义常量,常量定义和使用时不能带$符

      注意:使用的时候不能用$this ,范围修饰符:: 前面还是这个类名,self关键字指向当前类名,parent关键字指向父类的类名;

      如果子类向访问父类的常量使用parent;

      案例:

        //父类

        class Person{

          cont age="23",

        }

        //子类

        class Child extends Person{

          const name="zhang";

          function fn(){

            echo self::age;                   //指向当前类名

            echo parent::name;    //指向父类

          }

        }

        $p=new Child;

        $p->fn();

      静态变量:在变量的前面加上关键字static,静态的属性不能使用->访问,只能使用  类名::$变量名;

      案例:

        class Perosn{

          static $name="zhang";

        }

        echo Person::$name;

      12.重载。覆盖;final关键字的使用

       子类继承父类的方法时,如果子类有和父类同名的方法从父类继承的方法就会被覆盖掉,这就是重载;

       但如果父类的方法前面加上final则子类无法重载父类的方法,就会报错

       案例:

       //父类:

       class Person{

          final function fn(){

            echo "我的孩子,不能起我的名字,否则会报错"

          }

       }

      class Child extends Person{

        function fn(){

          echo "我不能用我爸的名字  我要报错"

        }

      }

      $p=new Child;

      $p->fn;

      子类想使用父类的构造函数,只能使用  parent::__construct()  使用的时侯直接调用了;

      案例:

      //父类

      class Person{

        public $name="zhang";

        function __construct(){

          echo $this->name;

        }

      }

      //子类

      class Child extends Person{

        function __construct(){

          parent::__construct();

        }

      }

      $p=new Child;

      public  protected  private 的区别?

      案例:了解即可:

      //父类

      class Person{

        public function a(){

           echo "a";

        }

        protected function b(){

          echo "b";

        }

        private function c(){

          echo "c";

        }

      }

      $p=new Person;

      $p->a();    不会报错

      $p->b();    会报错

      $p->c();  会报错

      //子类

      class Child extends Person{

        function d(){

          parent::a()      //调用父类的a方法

        }

        function e(){

          parent::b()

        }

        function f(){

          parent::c()

        }

      }

      $c=new Child;

      echo $c->d();  不会报错

      echo $c->e();  不会报错

      echo $c->f();   会报错

  • 相关阅读:
    Linux目录管理常用指令
    生成器
    Python上的MVC和MVT理解,请求头,请求体,请求行的理解
    sellect、poll、epoll
    冒泡法排序
    (android / IOS)
    发现一个bug如何定位是前端还是后台问题?
    ANR----以及如何定位是前端问题还是后台问题?
    给你一个web端项目你如何展开测试?
    给你一个app你如何展开测试?
  • 原文地址:https://www.cnblogs.com/liancai001/p/10677172.html
Copyright © 2011-2022 走看看