1、常用术语说明
class 类
object 对象
new 实例化
member 类成员
method 方法,成员函数
property 属性,成员变量
constant 类常量
2、类的构造
class ClassName{ //class关键字加类名
//类中只能有三种成员:属性、类常量、方法,不限数量
//成员变量(属性)
public $var; //普通属性,只能通过对象访问,声明时必须使用访问控制修饰符
public static $s_var = 0; //静态属性,使用static关键字修饰的属性
const PI = 3.14; //类常量,声明时必须使用const关键字修饰并赋值,其值不可修改
//成员方法
function fn0(){
//普通成员方法
echo '普通成员方法运行了
';
}
static function fn1(){
//静态方法
echo self::$s_var.'静态方法运行了
'; //类似$this,在类内部使用self关键字代表当前类名
}
public function __construct($var){
//构造方法,对象实例化时自动调用该方法
$this->var = $var; //$this表示当前对象
echo '构造方法运行了
';
}
public function __destruct(){
//析构方法,对象销毁时自动调用该方法
echo '析构方法运行了
';
}
public function __clone(){
//克隆方法,克隆对象时自动调用该方法
echo '克隆方法运行了
';
}
}
$c = new ClassName('test'); //对象实例化
echo $c->var.'
'; //访问对象属性$obj->var
$c->var = 'update'; //修改对象属性
$c->new_var = 'add'; //新增对象属性
var_dump($c);echo '
';
unset($c->new_var); //删除对象属性
var_dump($c);echo '
';
$c->fn0(); //调用成员方法
echo ClassName::PI.'
'; //访问类常量,使用:类名::类常量名
echo ClassName::$s_var.'
'; //访问静态属性,使用:类名::$静态属性名
ClassName::fn1(); //调用静态方法
3、成员修饰符
3.1、关键字:
类常量,不可修改性const(修饰属性),类常量只能通过类访问:类名加范围解析操作符(双冒号::)
静态成员-static(修饰属性和方法),静态成员只能通过类访问
不可继承性final(修饰类和方法)
3.2、访问控制符
public:表示公有的,其修饰的属性和方法可以在类内和类外访问,可以被继承
protected:表示受保护的,,其修饰的属性和方法只可以在类内访问,可以被继承
privated:表示私有的,其修饰的属性和方法只可以在类内访问,不可以被继承
属性前一定要加一个访问控制修饰符,类常量不用加访问控制修饰符,方法前可以不加访问控制修饰符,默认是public
4、对象值传递
对象的赋值操作是引用赋值,即:当将对象a的值赋值给对象b时,a和b指向内存中同一个地址
如果需要实现真正的复制,可以使用对象克隆方法:$b = clone $a;
私有化__clone方法可以禁止对象被克隆:private function __clone(){}
5、类的加载
类的访问必须保证类在内存中已经存在,所有在使用类之前需要将包含类的PHP文件加载到内存,本质是文件加载。
手动加载:
if(!class_exists('Man')){
//类不存在,加载
include_once 'Man.php';
}
new Man();
自动加载:
php7以前:
function __autoload($class_name){
//假设有多个类放在多个文件夹中
//先尝试去a文件夹中寻找类
$file = 'a/'.$class_name.'.class.php';
if(file_exists($file)){
include_once $file;
exit;
}
//再尝试去b文件夹中寻找类
$file = 'b/'.$class_name.'.class.php';
if(file_exists($file)){
include_once $file;
exit;
}
//以此类推,直到找到类或找完所有包含类的文件夹为止
}
$d = new Dog(); //实例化Dog类,系统自动调用__autoload函数
php7以后:
function my_autoload($class_name){
$file = 'a/'.$class_name.'.class.php';
if(file_exists($file)){
include_once $file;
exit;
}
$file = 'b/'.$class_name.'.class.php';
if(file_exists($file)){
include_once $file;
exit;
}
}
spl_autoload_register('my_autoload');
$d = new Dog();
也可以分开多个加载函数:
function a_autoload($class_name){
$file = 'a/'.$class_name.'.class.php';
if(file_exists($file)){
include_once $file;
}
}
function b_autoload($class_name){
$file = 'b/'.$class_name.'.class.php';
if(file_exists($file)){
include_once $file;
}
}
spl_autoload_register('a_autoload');
spl_autoload_register('b_autoload');
$d = new Dog();
自动加载类:
class Autoload{
public static function loadA($class_name){
$file = 'a/'.$class_name.'.class.php';
if(file_exists($file)){
include_once $file;
}
}
public static function loadB($class_name){
$file = 'b/'.$class_name.'.class.php';
if(file_exists($file)){
include_once $file;
}
}
}
spl_autoload_register(array('Autoload','loadA'));
spl_autoload_register(array('Autoload','loadB'));
$d = new Dog();
6、设计模式
单例模式:一个类有且仅有一个对象,例如操作系统中的资源管理器,目的是为了保护资源的唯一性
class Singleton{
//使用一个静态属性保存生产出来的对象
private static $object = NULL;
//私有化构造方法
private function __construct(){}
//类入口
public static function getInstance(){
if(!(self::$object instanceof self)){
self::$object = new self();
}
return self::$object;
}
//私有化克隆方法,防止克隆产生新对象
private function __clone(){}
}
//实例化两个对象
$s = Singleton::getInstance();
$s1 = Singleton::getInstance();
var_dump($s,$s1); //检测到是同一个对象
工厂模式factory:
由一个地方生产对象,其他位置就不需要额外实例化对象,从而可以方便后期代码统一维护(改名),方便隐藏真实的类结构。
工厂模式针对相似模型的统一产出,要有一批具有类似功能的类,其本质是相似的大类下的小类
静态工厂(生产对象时需要知道类名):
class Man{
public function display(){
echo 'Man
';
}
}
class Woman{
public function display(){
echo 'Woman
';
}
}
class Child{
public function display(){
echo 'Child
';
}
}
class HumanFactory{
public static function getInstance($class_name){
return new $class_name();
}
}
$m = HumanFactory::getInstance('Man');
$w = HumanFactory::getInstance('Woman');
$c = HumanFactory::getInstance('Child');
$m->display();
$w->display();
$c->display();
匿名工厂(生产对象时需要知道类名对应的符号):
class HumanFactory{
public static function getInstance($flag){
switch ($flag) {
case 'm':
return new Man();
case 'w':
return new Woman();
case 'c':
return new Child();
default:
return null;
}
}
}
$m = HumanFactory::getInstance('m');
$w = HumanFactory::getInstance('w');
$c = HumanFactory::getInstance('c');
标签:function,入门,public,file,var,PHP,class,面向对象编程,name
来源: https://www.cnblogs.com/chuanzi/p/10380555.html