面对对象与面对过程是一种思想而不是一种技术
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
总之来说面对对象也只是宏观上面对对象 只不过是在面对过程的基础上 高处一个维度 明确完成业务的对象 微观上依旧是面对过程思想 更符合当代思想逻辑
<?
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结构体中时 可以直接传入函数名
//上面的例子 传入的是一个数组 且第一个是类名 系统会自动把他划分为 类名调用静态函数
// 如果是普普方法的话 数组这中的第一个值为实例化对象
?>