zoukankan      html  css  js  c++  java
  • php类和对象(一)

    对象:任何东西都可以称为对象,类实例化出来的东西
    类:对所有同类的对象抽象出来的东西

    Info: Code,Name,Sex,Nation,Birthday
    对象:一条具体的信息 p001 张三 男 汉族 1990-2-3

    定义类:

    class Ren
    {
        public $Name; //成员变量
        protected $age; 
        private $height;
        var $sex; //一般不要给成员变量赋值
        
        function __construct($s) //构造函数
        {
            $this->sex = $s;
        }
        function __destruct() //析构函数,对象销毁前执行
        {
            echo "该对象销毁了!";
        }
    
        function Run()  //成员函数(方法)
        {
            echo "这个人正在奔跑!";
        }
        function Say()
        {
            echo $this->Name."正在说话!";
        }
    }
    //使用类
    //1.实例化对象
    $r = new Ren("男");
    //2.给成员变量赋值(调用成员变量)
    $r->Name = '张三'; //给对象的Name赋值
    echo $r->age;
    
    var_dump($r);
    //3.调用成员方法
    $r->Run();
    $r->Say(); //执行成员方法
    
    //访问修饰符
    //1.如果要加访问修饰符,需要去掉var
    //2.三种:public公有的  protected受保护的  private私有的
    //3.如果不加访问修饰符,默认是public
    
    //$this引用
    //$this代表该对象(哪个对象调用),不是代表该类
        
    //构造函数
    //1.写法特殊:__construct(),双下划线
    //2.执行特殊:在造对象的时候最先执行
    //作用:对对象进行初始化操作 

    面向对象三大特性: 封装,继承,多态
    1.封装
    目的:让类更加安全,不让外界直接访问类里面的成员变量
    做法:1.把成员变量做成私有的
    2.做一个方法来实现变量取值或赋值,在方法里面加限制条件

    class Ren
    { 
        private $name;
        private $sex;
        private $age;
        function SetAge($a) //给age赋值的函数
        {
            if($a>10 && $a<50)
            {
                $this->age = $a;
            }
        }
        function GetAge() //取age的值
        {
            return $this->age;
        }
    }
    $r = new Ren("男");
    $r->SetAge(40);
    
    echo $r->GetAge();

    使用类里面提供的魔术方法也可以实现对私有成员的操作
    __set()特点:会自动执行,把赋值语句中的变量名作为第一个参数,把变量值作为第二个参数调用__set方法
    __get()特点:会自动执行,把取值语句中的变量名作为参数调用__get方法

    function __set($name,$value) //对类里面的私有成员进行赋值的魔术方法
        {
            if($name == "age")
            {
                if($value>20 && $value<50)
                {
                    $this->$name = $value;
                }
            }
            else
            {
                $this->$name = $value;
            }
        }
        
        function __get($name) //对类里面的私有成员进行取值的魔术方法
        {
            return $this->$name;
        }
    $r->__set("name","张三");
    $r->name = "李四"; //执行该语句会自动调用__set方法
    $r->sex = "女";
    $r->age = 40;
    var_dump($r);
    echo $r->__get(age);

    2.继承
    如果要继承,就必须有子类
    概念: 如果一个类有子类,那么该子类会继承父类的一切东西(私有的成员访问不到)
    做法: 在定义子类的时候需加一个关键字 extends
    特点: 单继承,一个儿子只能有一个父亲,一个类只能有一个父类
    如果父类中有构造函数,那么子类在实例化的时候需要依照父类构造函数的标准来实例化
    子类对父类方法的重写: 在子类中写一个同样的方法
    final: 用来修饰类,代表该类是一个最终类,该类无法被继承

    class Test extends Ren   //Test是Ren的子类
    {
        public $birthday;    //子类可以加入自己的东西
        function run()
        {
            echo "run";
        }
        function Say()
        {
            parent::Say();   //调用父类的Say()方法   parent双冒号,只能在子类中使用
            echo " Test say";
        }
    }
    $t= new Test("女");
    $t->code ="p001";
    var_dump($t);
    $t->Say();   //子类对父类方法的重写

    静态成员
    类里面的普通成员是属于对象的,不是属于类的(调用的时候使用对象调用)
    什么是静态的: 类静态成员是属于类的,不是属于每个对象的
    定义静态成员用关键字static
    静态方法里面无法调用普通成员
    静态方法可以调用静态成员,使用self关键字调用
    self代表该类用::调用,$this代表该对象,用->调用

    class Ren
    {
         const π=3.1415926;      //将某些类里面常用到的东西定义为常量, 关键字const
        public static $class;   //static关键字是定义静态的
        public $code;
        private $name;
        private $sex;
        private $age;
    
        function __construct($s)
        {
            $this->sex = $s;
        }
        public function Say()
        {
            echo self::$class;     //普通方法可以调用静态成员
            echo "hello";
        }
        
        static function Test()    //静态方法
        {
            echo self::$class;    //调用自身类里面的静态成员
            echo "静态方法!";
        } 
    }
    $r =new Ren("女"); Ren
    ::$class = "0305"; echo Ren::$class; //访问静态成员用双冒号 Ren::Test(); $r->Say();

    子类中也可以用静态成员与静态方法:

    class Test extends Ren   //Test是Ren的子类
    {
        public $birthday;    //子类可以加入自己的东西
        public static $shengao;
        function run()
        {
            echo "run";
        }
        function Say()
        {
            parent::Say();   //调用父类的Say()方法   parent双冒号,只能在子类中使用
            echo " Test say";
        }
        static function aa()
        {
            echo "子类中能用静态方法吗?";
        }
    }
    $t= new Test("女");
    Test::$shengao ="170";
    echo Test::$shengao;
    Test::aa();
  • 相关阅读:
    面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
    位运算技巧3
    Android消息循环分析
    ubuntu安装软件的方式
    fragment Trying to instantiate a class com.example.testhuanxindemo.MyFragment that is not a Fragmen
    LAN路由
    php 简易验证码(GD库)
    飘逸的python
    它们,不能是虚函数!!!
    HTML5调用摄像头实现拍照功能(兼容各大主流浏览器)
  • 原文地址:https://www.cnblogs.com/xinghun/p/5441128.html
Copyright © 2011-2022 走看看