php基础知识:类与对象(1)


Posted in PHP onDecember 13, 2006

类的定义:
   以关键字 class 开头,后面跟着类名,可以是任何非 PHP 保留字的名字。后面跟着一对花括号,里面包含有类成员和方法的定义。

伪变量$this
可以在当一个方法在对象内部调用时使用。$this 是一个到调用对象(通常是方法所属于的对象,但也可以是另一个对象,如果该方法是从第二个对象内静态调用的话)的引用。
//??静态调用的内部到底是怎样的?
看个例子:
class A
{
   function foo()
   {
       if (isset($this)) {
           echo '$this is defined (';
           echo get_class($this);
           echo ")\n";
       } else {
           echo "\$this is not defined.\n";
       }
   }
}
class B
{
   function bar()
   {
       A::foo();
   }
}
$a = new A();
$a->foo();
A::foo();
$b = new B();
$b->bar();
B::bar();
输出结果为:
$this is defined (a)
$this is not defined.
$this is defined (b)
$this is not defined.
/*我希望知道这个例子的内存等的具体实现,我暂时无法理解。如果有人可以讲清楚,可以告诉我。我们宿舍牛头现在正在冬眠,等他醒来,我会问。*/

new
要创建一个对象的实例,必须创建一个新对象并将其赋给一个变量。当创建新对象时该对象总是被赋值,除非该对象定义了构造函数并且在出错时抛出了一个异常。
当把一个对象已经创建的实例赋给一个新变量时,新变量会访问同一个实例,就和用该对象赋值一样。此行为和给函数传递入实例时一样。可以用克隆给一个已创建的对象建立一个新实例。

(这几句话虽然很短,但是未必容易理解。)
例子如下:
class SimpleClass
{
   // 成员声明
   public $var = 'a default value';

   // 方法声明
   public function displayVar() {
       echo $this->var;
   }
}

//看下面的图.1>new 在heap(堆)中实例化一个对象。2>将指针$instance指向他
$instance = new SimpleClass();
//3>将指针$assigned指向heap中的实例化对象
$assigned   =  $instance;
//4>将$instance的引用(地址)赋值给$reference
$reference  =& $instance;
$instance->var = '$assigned will have this value';
$instance = null;
// 5>间断$instance与heap中实例的连接。
var_dump($instance);
var_dump($reference);
var_dump($assigned);
输出:
NULL
NULL
object(SimpleClass)#1 (1) {
  ["var"]=>
    string(30) "$assigned will have this value"
}
图示整个过程:
php基础知识:类与对象(1)

类继承extends
一个类可以在声明中用 extends 关键字继承另一个类的方法和成员。不能扩展多个类,只能继承一个基类。

被继承的方法和成员可以通过用同样的名字重新声明被覆盖,除非父类定义方法时使用了 final 关键字。可以通过 parent:: 来访问被覆盖的方法或成员。(继承的机制到底怎样的?)
源代码如下:
class ExtendClass extends SimpleClass
{
   // Redefine the parent method
   function displayVar()
   {
       echo "Extending class\n";
       parent::displayVar();
   }
}
$extended = new ExtendClass();
$extended->displayVar();

输出:
Extending class
a default value

PHP 相关文章推荐
PHP中文件上传的一个问题
Sep 04 PHP
php curl常见错误:SSL错误、bool(false)
Dec 28 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
Mar 06 PHP
PHP无限分类(树形类)的深入分析
Jun 02 PHP
PHP大小写问题:函数名和类名不区分,变量名区分
Jun 17 PHP
PHP使用json_encode函数时不转义中文的解决方法
Nov 12 PHP
使用PHP编写发红包程序
Jul 22 PHP
PHP 数组遍历foreach语法结构及实例
Jun 13 PHP
Yii框架视图、视图布局、视图数据块操作示例
Oct 14 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 PHP
php+mysql实现的无限分类方法类定义与使用示例
May 27 PHP
PHP代码覆盖率统计详解
Jul 22 PHP
php基础知识:函数基础知识
Dec 13 #PHP
php基础知识:控制结构
Dec 13 #PHP
《PHP边学边教》(04.编写简易的通讯录――视频教程1)
Dec 13 #PHP
IIS+PHP+MySQL+Zend配置 (视频教程)
Dec 13 #PHP
傻瓜化配置PHP环境――Appserv
Dec 13 #PHP
《PHP边学边教》(02.Apache+PHP环境配置――下篇)
Dec 13 #PHP
中篇:安装及配置PHP
Dec 13 #PHP
You might like
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
ThinkPHP php 框架学习笔记
2009/10/30 PHP
比较简单实用的PHP无限分类源码分享(思路不错)
2011/10/13 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
网页javascript精华代码集
2007/01/24 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
JQuery中form验证出错信息的查看方法
2013/10/08 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
2015/06/19 Javascript
Markdown+Bootstrap图片自适应属性详解
2016/05/21 Javascript
jQuery实现联动下拉列表查询框
2017/01/04 Javascript
vue升级之路之vue-router的使用教程
2018/08/14 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
vue实现的组件兄弟间通信功能示例
2018/12/04 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
2019/01/08 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
[02:49]2018DOTA2亚洲邀请赛主赛事决赛日战况回顾 Mineski鏖战5局夺得辉耀
2018/04/10 DOTA
基于python实现微信模板消息
2015/12/21 Python
Python实现选择排序
2017/06/04 Python
Python数据结构与算法之图结构(Graph)实例分析
2017/09/05 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
python 3.8.3 安装配置图文教程
2020/05/21 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
解决pycharm不能自动保存在远程linux中的问题
2021/02/06 Python
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
美国二手奢侈品寄售网站:TheRealReal
2016/10/29 全球购物
工程力学专业毕业生求职信
2013/10/06 职场文书
1亿有多大教学反思
2014/05/01 职场文书
活动总结范文
2014/08/30 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
简易离婚协议书范本2014
2014/10/15 职场文书
上帝也疯狂观后感
2015/06/09 职场文书
golang中实现给gif、png、jpeg图片添加文字水印
2021/04/26 Golang
教你怎么用Python实现多路径迷宫
2021/04/29 Python
Redis如何实现分布式锁
2021/08/23 Redis
springboot+zookeeper实现分布式锁
2022/03/21 Java/Android