PHP 类与对象 全解析( 一)
目录
1.类与对象
对象:实际存在该类事物中每个实物的个体。$a =new User(); 实例化后的$a
引用:php的别名,两个不同的变量名字指向相同的内容
封装: 把对象的属性和方法组织在一个类(逻辑单元)里
继承:以原有的类为基础,创建一个新类,从而代码复用的目的;
多态:允许将子类类型的指针赋值给父类类型的指针。
-------------------------------------
2.自动加载对象:
自动加载通过定义特殊的__autoload函数,当引用没有在脚本中定义的类时会自动调用这个函数.
[php] view plaincopyprint?
function __autoload($class){
require_once("classes/$class.class.php");
}
为什么要使用__autoload
1,首先是不知道这个类文件存放在什么地方,
2,另外一个就是不知道什么时候需要用到这个文件。
3,特别是项目文件特别多时,不可能每个文件都在开始的部分写很长一串的 require …
替代了一
require_once ("classes/Books.class.php") ;
require_once ("classes/Employees.class.php" ) ;
require_once ("classes/Events.class.php") ;
require_once ("classes/Patrons.class.php") ;
zend推荐了一种最流行的办法,在文件名中包含路径。例如下面的例子:
[php] view plaincopyprint?
view sourceprint?
// Main.class
function __autoload($class_name) {
$path = str_replace('_', DIRECTORY_SEPARATOR, $class_name);
require_once $path.'.php';
}
temp = new Main_Super_Class();
所有的下划线都会被替换成路径中的分隔符,上例中就会去 Main/Super/Class.php文件。
缺点:
是在编码过程中,必须明确的知道代码文件应当所处的位置,
而且由于将文件路径硬编码在了类名中,如果需要修改文件夹的结构时,我们必须手工修改所有的类名。
如果是在一个开发环境中,并且对于速度不是很在意的话,使用'Include All’这个方法是非常方便的。
通过将所有类文件放在一个或几个特定文件夹中,然后通过遍历的方式查找加载。
例如
<?php
$arr = array (
'Project/Classes',
'Project/Classes/Children',
'Project/Interfaces'
);
foreach($arr as $dir) {
$dir_list = opendir($dir);
while ($file = readdir($dir_list)) {
$path = $dir.DIRECTORY_SEPARATOR.$file;
if(in_array($file, array('.', '..')) || is_dir($path))
continue;
if (strpos($file, ".class.php"))
require_once $path;
}
}
?>
另外一个方法是在类文件和他的位置之间建立关联的配置文件,例如:
view sourceprint?
// configuration.php array_of_associations = array(
'MainSuperClass' = 'C:/Main/Super/Class.php',
'MainPoorClass' = 'C:/blablabla/gy.php'
);
调用的文件
<?php
require 'autoload_generated.php';
function __autoload($className) {
global $autoload_list;
require_once $autoload_list[$className];
}
$x = new A();
?>
------------------------------------------------
3.构造函数和析构函数
PHP 构造方法 __construct() 允许在实例化一个类之前先执行构造方法。
构造方法是类中的一个特殊方法。当使用 new 操作符创建一个类的实例时,构造方法将会自动调用,其名称必须是 __construct() 。
(在一个类中只能声明一个构造方法,而是只有在每次创建对象的时候都会去调用一次构造方法,不能主动的调用这个方法,
所以通常用它执行一些有用的初始化任务。该方法无返回值。)
作用: 用来创建对象时初始化对象
子类执行分类的构造函数parent::__construct().
析构函数: __destruct ()定义:特殊的内成员函数,没有返回类型,没有参数,不能随意调用,也没有重载;
只是在类对象生命结束的时候,由系统自动调用释放在构造函数中分配的资源。
与构造方法对应的就是析构方法,析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等。
析构函数不能带有任何参数,其名称必须是 __destruct() 。
作用:清理了善后工作,例如,在建立对象时使用new 开辟了一个内存空间,应在退出前使用析构函数释放在构造函数中分配的资源。
例子:
class Person {
public $name;
public $age;
//定义一个构造方法初始化赋值
public function __construct($name,$age) {
$this->name=$name;
$this->age=$age;
}
public function say() {
echo "my name is :".$this->name."<br />";
echo "my age is :".$this->age;
}
//析构函数
function __destruct()
{
echo "goodbye :".$this->name;
}
}
$p1=new Person("ren", 25);
$p1->say();
---------------------------------------------------------------
4 .访问控制
对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的
public 所定义的类成员可以在任何地方被访问;
protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);
private 定义的类成员则只能被其所在类访问。
对类成员的访问控制
类成员都必须使用关键字public、protected 或 private 进行定义
对方法的访问控制
类中的方法都必须使用关键字public、protected 或 private 进行定义。如果没有设置这些关键字,则该方法会被设置成默认的 public。
例子:
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private'; function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
} $obj = new MyClass();
echo $obj->public; // 这行能被正常执行
echo $obj->protected; // 这行会产生一个致命错误
echo $obj->private; // 这行也会产生一个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private
-------------------------------------------------------------
5 .对象继承
继承定义:以原有的类为基础,创建一个新类,从而代码复用的目的;
--------------------------------------
覆写是对象继承时用到的
重载是单对象中同方法名不同参数的方法
--------------------------------------
继承已为大家所熟知的一个程序设计特性,PHP 的对象模型也使用了继承。继承将会影响到类与类,对象与对象之间的关系。
比如,当扩展一个类,子类就会继承父类的所有公有和保护方法。但是子类的方法会覆盖父类的方法。
继承对于功能的设计和抽象是非常有用的,而且对于类似的对象增加新功能就无须重新再写这些公用的功能。
class Person {
public $name;
public $age;
function say() {
echo "my name is:".$this->name."<br />";
echo "my age is:".$this->age;
}
}
// 类的继承
class Student extends Person {
var $school; //学生所在学校的属性
function study() {
echo "my name is:".$this->name."<br />";
echo "my shool is:".$this->school;
}
}
$t1 = new Student();
$t1->name = "zhangsan";
$t1->school = "beijindaxue";
$t1->study();
------- --------- ------ --------- -------- -----
6 .范围解析操作符(::)
范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员、方法和常量,还可以用于覆盖类中的成员和方法。
当在类的外部访问这些静态成员、方法和常量时,必须使用类的名字。
self 和 parent 这两个特殊的关键字是用于在类的内部对成员或方法进行访问的。
注意:
当一个子类覆盖其父类中的方法时,PHP 不会再执行父类中已被覆盖的方法,直到子类中调用这些方法为止
例子:
<?php
class OtherClass extends MyClass
{
public static $my_static = 'static var'; public static function doubleColon() {
echo parent::CONST_VALUE . "\n";
echo self::$my_static . "\n";
}
} OtherClass::doubleColon();
?>
---------------------------------------------------
PHP 类与对象 全解析( 一)的更多相关文章
- PHP 类与对象 全解析(三)
目录 PHP 类与对象 全解析( 一) PHP 类与对象 全解析( 二) PHP 类与对象 全解析(三 ) 13.魔术方法 定义:PHP把所有以__(两个下划线)开头的类方法当成魔术方法 __ ...
- PHP 类与对象 全解析( 二)
目录 PHP 类与对象 全解析( 一) PHP 类与对象 全解析( 二) PHP 类与对象 全解析(三 ) 7.Static关键字 声明类成员或方法为static,就可以不实例化类而直接访问.不能通过 ...
- PHP 类与对象 全解析方法
1.类与对象 对象:实际存在该类事物中每个实物的个体.$a =new User(); 实例化后的$a 引用�php的别名,两个不同的变量名字指向相同的内容 封装: 把对象的属性和方法组织在一个类(逻辑 ...
- 你不知道的JavaScript--Item22 Date对象全解析
本篇主要介绍 Date 日期和时间对象的操作. 1. 介绍 1.1 说明 Date对象,是操作日期和时间的对象.Date对象对日期和时间的操作只能通过方法. 1.2 属性 无: Date对象对日期和时 ...
- OC分类(类目/类别) 和 类扩展 - 全解析
OC分类(类目/类别) 和 类扩展 - 全解析 具体见: oschina -> MyDemo -> 011.FoundationLog-OC分类剖析 http://blog.csdn. ...
- 解析Java类和对象的初始化过程
类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...
- python 类与对象解析
类成员: # 字段 - 普通字段,保存在对象中,执行只能通过对象访问 - 静态字段,保存在类中, 执行 可以通过对象访问 也可以通过类访问 # ...
- [转载]解析 Java 类和对象的初始化过程
原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-clobj-init/index.html 由一个单态模式引出的问题谈起 类的初始化和对象初始化 ...
- 类、对象以及jvm运行内存解析
一.JVM内存的分析: 第一步:存放在硬盘上的程序首先要被加载到内存空间中. 第二步:内存中的jvm找到程序中main函数作为入口,然后开始执行. 第三步:执行过程中的内存管理:内存分为四个部分: 栈 ...
随机推荐
- AJPFX简评:MT5平台
MetaTrader 5全面改进的图表和扩展的功能 MetaTrader软件开发商在MT4获得全球交易商全面好评之后,又再次研发推出了更为先进的MT5交易软件. MT5的主要特征●改进的图表和即时 ...
- OSLab课堂作业2
日期:2019/3/23 内容: 实现内容 要求 mysys.c 实现函数mysys,用于执行一个系统命令. mysys的功能与系统函数system相同,要求用进程管理相关系统调用自己实现一遍 使 ...
- JVM之JIT
JIT技术是JVM中最重要的核心模块之一.我的课程里本来没有计划这一篇,但因为不断有朋友问起,Java到底是怎么运行的?既然Hotspot是C++写的,那Java是不是可以说运行在C++之上呢?为了澄 ...
- jQuery基础笔记(5)
day56 参考:https://www.cnblogs.com/liwenzhou/p/8178806.html#autoid-1-9-5 文档处理 添加到指定元素内部的后面 $(A).append ...
- 【python入门】之教你编写自动获取金币脚本
本文作者:青衫磊落 最近看到个特别全面源码分享网站,刚好有个项目是一直想做但是没有头绪的,就想下载学习一下.注册账号后,发现还需要若干金币.后来发现可以通过每隔一定时间发心情状态来获得金币,就打算写一 ...
- 看linux正在运行的服务用哪个命令?
https://zhidao.baidu.com/question/117779006.html 查看服务进程:ps aux查看服务cpu利用:top查看服务对应端口:netstat -nlp pst ...
- spring boot 使用application.properties 进行外部配置
application.properties大家都不陌生,我们在开发的时候,经常使用它来配置一些可以手动修改而且不用编译的变量,这样的作用在于,打成war包或者jar用于生产环境时,我们可以手动修改环 ...
- 微信小程序一些总结
1.体验版和线上是啥区别,啥关系 在微信开发者工具里提交代码后进入体验版,在微信后台里点击版本管理,就可以看到线上版本,和开发体验版,描述里有提交备注. 在体验版里发布审核之后会进入到线上.他们两个可 ...
- SSH远程连接服务
一.SSH 原理图 二.SSH 原理描述 2.1:什么是SSH SSH是专门为了远程登录会话和其他网络服务提供的安全性协议,使用SSH协议可以有效的防止远程连接会话的时候出现信息泄密,在数据传输的时候 ...
- linux下安装mysql-5.7.20
1.下载地址 https://downloads.mysql.com/archives/community/ 2.安装步骤 解压: groupadd mysql useradd -r -g mysql ...