class_exists(), :判断某个类是否存在(定义过)
interface_exists(), :判断接口是否存在
get_class():获取某个对象的“所属类名”
get_parent_class(), :获取某个对象的“所属父类的类名”
get_class_methods(), :获取一个类的所有方法,返回一个索引数组,就是这些方法的名字。
get_class_vars(), :获取一个类的所有属性,返回一个数组,下标为属性名,值为属性值。
get_declared_classes():获得所有声明过的类(含系统中的类)
is_object():判断是否对象
get_object_vars():获得对象的所有属性,返回一个数组,下标为属性名,值为属性值
运算符:
new:
instanceof: 判断一个对象是否是某个类的“实例”
注意一个现象:
当一个对象($o1) 调用一个实例方法,然后,在该实例方法(f1)中又去“静态”调用另一个类的方法(f2),则在方法f2中,会自动获得在方法f1中的那个$this对象。
对比:
可见f2方法直接调用会产生严重错误(因为找不到$this)
可见static有3个不同含义的语法:
函数中的静态变量:
function f1(){
static $v1 = 1;
}
类中的静态成员:
class A{
static $v1 = 1;
static function f1(){}
}
方法中的动态指代“当前类”:
class A{
function f1(){
static::f2();//static此时指代调用f1这个方法的类(或对象的类)
self::f2(); //self这里永远指代当前A这个类。
}
}
封装:
就是把数据“封闭”起来,尽量不给别人看到。
面向对象的基本语法“类的定义”形式,可以认为是最基本封装——封装了很多数据到某个类(对象)。
但:
更严格(更常说)的封装,是尽量将属性做出“私有的”——并通过共有的方法来向外提供对该属性的“可控性操作”:
继承:
多态:
多态:看起来用的是相同的东西(方法),但会得到不同的结果。
通常是指:一个对象可以使用相同的方法(动作)但得到不同的结果:
(这里是其他常见面向对象语法示例:)
class A{
function f1($x ){....做事情1;。。。。}
function f1($x, $y ){....做事情2;。。。。}
function f1($x, $y, $z ){....做事情3;。。。。}
}
也指:不同的对象使用相同的方法,但得到不同的结果:
Mkdir(目录地址,权限,是否递归创建=false);
Rmdir(目录地址)
仅仅可以删除空目录。(不支持递归删除)
Rename(旧地址,新地址)
该函数也支持操作文件。
打开目录 目录句柄 = opendir(目录地址)
目录句柄:php程序与目录间的一个联系。
依次读取目录内文件 文件名 = readdir(目录句柄);
依次读取一个文件(子目录),同时向下移动句柄指针。如果读取不到返回false!
目录内存在两个逻辑子目录 ., .. 分别表示当前目录和上级目录!
通过配合 循环结构 完成目录内所有文件的读取:
处理 0 文件名:
关闭目录 closedir()
打开某个目录
依次读取目录内文件
如果某个文件为目录
递归对该目录采用打开,读取,判断这个递归草
递归点: 如果子文件为目录,则递归
出口: 如果目录中不存在子目录,则不需要继续递归!
使用特定数量的缩进达到树状目的!
核心问题,计算需要缩进的数量!
缩进级别,与递归调用深度保持一致。每当执行一级递归操作,所找到的文件的缩进级别+1;
语法实现:
增加一个参数,表示当前函数调用的深度级别,每当递归+1;
使用多维数组的嵌套,表示层级关系!
例如:
实现:
原文:https://www.cnblogs.com/RighTgraM/p/10925080.html