php面对对像基础

面对对象与面对过程是一种思想而不是一种技术 

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了

面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

总之来说面对对象也只是宏观上面对对象 只不过是在面对过程的基础上 高处一个维度 明确完成业务的对象 微观上依旧是面对过程思想 更符合当代思想逻辑

<?
  class student{
    public $name;
    public $age;
    const PI = 3.1416926;//常量
    public function getName(){
    return $name;
    }
}
$a = new student;
$s = new student();//实例化 
var_dump($s);
//对象调用类属性
$a->name;//此时不用加$ 自动对应类中的$name
//对象调用方法 
$s->getName();
//类调用类常量
student::PI;
?>

php 中类的结构体的第一层 只允许出现 属性 方法 以及类常量 echo这种结构体是不允许出现的 只能放在方法中 

PHP类的实例化有两种形式 一种是带(); 一种不带(); 都要依赖于关键字 new 

var_dump对象实例 会返回object类型 object (类名) #编号(有几个属性){属性值}

PHP中 有三种访问修饰限定符 分别是public protected private 三种 属性必须要被访问修饰符修饰 方法可以没有修饰符 默认public  但是建议都加上修饰符 

public 公开 任何地方都能访问

protected受保护的 类外部不能访问 但是子类可以访问

private 私有的 只有类结构内部可以访问  

对象一旦产生 可以自主对自身属性进行增删改查 只不过增删不常用  

PHP构造方法 是一种稍微特殊一点的方法  每次实例化对象时都会自动调用 构造方法  可以利用构造方法 给每个对象的属性赋值,从而使对象拥有独特性

<?php
   class student{
      public $age;
      public $name;
      public fuunction __construct($name,$age){
              $this->name=$name;    
              $this->age=$age;
      }
}
   $s=new student('ada',18);
?>

构造方法 __construct(); 本质上依旧是一种方法  所以依旧可以利用对象实例调用 

与__construct();相对应的是__distruct();析构函数  对象临死前会调用此方法 通常用来释放资源  但是php在脚本结束时自动释放资源 所以很少会使用  unset();也会调用__distruct();

对象之间的传值 都是引用传值 新变量名 与 旧变量名 指向堆中的同一地址  不会像值传递那样 新赋值一个内容 如果想要新实例与旧实例完全没关系 可以使用clone关键字 在堆中克隆一个一模一样的对象实例 然后栈中的新变量名指向堆中新的对象实例 

类结构下的 属性 方法 都是属于对象的  由具体对象调用 但是类常量 是属于类的 是不可以更改的 通过类调用类常量要使用范围解析操作符 :; 类名::常量名  类常量的定义只能使用const这种方式  不能使用define();因为define属于语法结构 不能放在第一层

除了类常量  静态成员也属于类  静态成员主要包括 静态属性(被static 修饰 过的属性 )静态方法 (被static 修饰过的方法 类调用静态成员 同样需要使用 :: 范围解析操作符   类名 :: 静态属性(需要$)

实际上对象也可以访问静态变量 只是不建议  同样也不建议使用换位解析操作符来访问普通方法  static方法中不允许使用$this对象 逻辑上不合理 通过:;访问的普通方法也不可以使用$this

$this 代表的而是类内部对象 class结构中 想要访问对象有两种方法 一种是利用 global关键字 另一种就是$this 内置对象 

与$this 功能相似的关键字 还有self关键字  self关键字的作用就是代替类名  当类名更改时降低维护成本 

实际开发中 通常一个文件就放一个类 并且命名时通常以 .class.php结尾 说明这是一个类文件

加载类有几种方式 第一种就是 利用inclue include_once require require_once手动加载 

                               第二种是利用自动加载机制  __autoload($classname); 此函数的工作机制是这样的 每当脚本需要实用类 并且找在内存中找不到时 会自动调用__autoload()函数 并且把想要的类名作为实参传入函数 然后我们在此函数中手工完成加载任务

 

<?php
function __autoload($className){
    $file = $className.'.class.php';   //所过自动加载类 那么文件就要遵守一定的规则 最好是 类名.class.php
    if(file_exists($file)){
        include_once "{$file}";
        exit;
    }
}
$s = new student();
echo $s->age;
?>

php7后就不在推荐使用__autoload()函数来完成加载任务 更推荐使用  sql-autoload-register();注册机制

<?php
/* 
 * 在外部 同文件夹下建立了 student.class.php  dog.class.php
 * 另外一个objectTwo文件夹下 建立了 teacher.class.php
 * 封装一个分类以及函数 可以直接完成类的加载
 */
  class AutoloadRegister{
    public static  function oneLoad($className){
        $file ='F:\server\secondweb\objectone\\'.$className.'.class.php';
        if(file_exists($file)){
            include_once "{$file}";
            //exit; //如果不exit 后面的代码会继续执行
        }
    }
    public static function twoload($className){
        $file = 'F:\server\secondweb\objecttwo\\'.$className.'.class.php';
        if(file_exists($file)){
            include_once "{$file}";
           //exit; //如果不exit 后面的代码会继续执行
        }
    }
    }
    spl_autoload_register(array('AutoloadRegister','oneload'));
    spl_autoload_register(array('AutoloadRegister','twoload'));
    //注册 当脚本需要对象且在内存中找不到时就会调用注册里面的方法  方法中有include_once 结构从而达到类加载功能 
    //当函数不放在class结构体中时 可以直接传入函数名 
    //上面的例子 传入的是一个数组 且第一个是类名 系统会自动把他划分为 类名调用静态函数
    // 如果是普普方法的话 数组这中的第一个值为实例化对象
?>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值