php类的一些特性:

1. 伪变量$this。$this是一个到主叫对象的引用。取值:该方法所从属的对象,可能是另外的对象(前提,当该方法被静态调用时)。$this变量存在于一个类的非静态方法中,在静态方法中是不存在的。

<?php
class A{
function f() {
if( isset($this) ) {
echo '$this is defined ('.get_class($this).')\n';
}
else {
echo '$this is not defined.\n';
}
echo "<br />";
}
};
class B{
function g() {
A::f();
}
} $a = new A();
$a->f();
A::f(); $b = new B();
$b->g();
B::g();
?>

结果:

$this is defined (A)\n

Strict Standards: Non-static method A::f() should not be called statically in /var/www/php/this.php on line 21
$this is not defined.\n Strict Standards: Non-static method A::f() should not be called statically, assuming $this from incompatible context in /var/www/php/this.php on line 15
$this is defined (B)\n Strict Standards: Non-static method B::g() should not be called statically in /var/www/php/this.php on line 25 Strict Standards: Non-static method A::f() should not be called statically in /var/www/php/this.php on line 15
$this is not defined.\n

其中调用非静态方法时是不允许的,所以这里产生了Strict警告。忽略警告信息,可以看出this的从属关系。

2. new:new className(), 其中className可以用变量代替,这一点上与php中可变函数类似,(对比一下,java中可以用反射机制去动态的创建,C++中比较麻烦,当然只是写起来比较麻烦,代码量比较大。。。)在类内定义时可以采用new self和new parent创建对象。

3. 对象的赋值以及引用:这个跟java比较像,一旦一个对象被创建就会一直驻留(当然会有垃圾回收机制来处理不使用的对象),对于变量的赋值,并不会影响到对象的改变,只是影响变量的值。当然在函数传递对象的时候也是这样的。引用就是将两个或者多个变量进行绑定,无论何时它们的值都是一样的。具体可以参考下面这个例子:

<?php
class A{
public $var = "A";
function func($name){
echo "object ".$name." call function func ".$this->var;
echo "<br />";
}
}; $var1 = new A();
$var2 = $var1;
$var3 = & $var1; $var1->func('$var1');
$var2->func('$var2');
$var3->func('$var3'); $var1->var = "A change to B"; $var1->func('$var1');
$var2->func('$var2');
$var3->func('$var3'); $var1 = null; //$var1->func('$var1');
//$var2->func('$var2');
//$var3->func('$var3'); var_dump( $var1 );
echo"<br />";
var_dump( $var2 );
echo"<br />";
var_dump( $var3 );
echo"<br />"; ?>

结果:

object $var1 call function func A
object $var2 call function func A
object $var3 call function func A
object $var1 call function func A change to B
object $var2 call function func A change to B
object $var3 call function func A change to B
NULL
object(A)#1 (1) { ["var"]=> string(13) "A change to B" }
NULL

4. extends 继承,不支持多重继承,一个类只能继承一个基类,覆盖:用同名函数或者同名变量,当覆盖方法时参数必须保持一致。父类中final方法不允许覆盖,parent::来访问被覆盖的方法和属性,构造函数除外。

5.属性方法:非静态属性必须标明其访问权限(在php5.4版本下实验),静态属性如果未标明其访问权限,默认情况下为public.

一个特别的地方:同一个类的对象即使不是同一个实例也可以互相访问对方的私有和保护成员

还有一个需要注意的地方:属性的初始化,初始化的值必须在编译阶段可以确定下来,所以必须是常数(不可以是变量的值或者表达式)。

另外一旦属性或者对象被覆盖,那么父类中的属性或者对象在本类中都是不可见的,对于静态的方法或者属性是可以通过parent来调用,其他的方法或者属性不可用。

<?php
class Test{
private $foo; public function __construct($foo){
$this->foo = $foo;
} private function bar(){
echo 'Accessed the private method.<br />';
}
public function baz(Test $other){
$other->foo = 'hello';
var_dump( $other->foo );
echo "<br />";
$other->bar();
} }; $test = new Test( 'test' );
$test->baz( new Test('other') ); ?>
string(5) "hello"
Accessed the private method.

6. $this, self, parent

$this只能适用于一个非静态方法和属性,静态方法中不存在this。self和parent一样,都是只适用于静态方法和属性的调用,区别在于self是指向自己的静态方法和属性,parent是指向父类的静态方法和属性,调用方式:self::$var/self::func(), parent::$var/parent::func().

7. static静态属性和静态方法不能用对象->来直接调用,静态属性如果未指明其访问权限,默认情况下为public.类常量:必须在编译前确定的值,只能为数值,不是任何的表达式。访问方式:$classname :: constant

8.构造函数和析构函数:构造函数形式__construct(), 析构函数形式__destory()

如果子类中定义了构造函数,那么将不会显式的调用父类中的构造函数,如果未定义,将会继承父类的构造函数并调用,析构函数也是同样的情况。

php学习小记2 类与对象的更多相关文章

  1. Java学习笔记之---类和对象

    Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态  例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...

  2. 学习笔记——Java类和对象

    今天学习了Java的类和对象的相关知识,由于Java面向对象的编程的思想和C++几乎一样,所以需要更多的关注Java的一些不同之处. 1.类 1.1 在类这一块,除了基本的成员变量,成员方法,构造函数 ...

  3. 【Python学习之七】类和对象

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python3.6 一.面向对象编程1.概念(1)面向对象编程(OOP ...

  4. Java学习笔记 04 类和对象

    一.类和对象的概念 类 >>具有相同属性和行为的一类实体 对象 >>实物存在的实体.通常会将对象划分为两个部分,即静态部分和动态部分.静态部分指的是不能动的部分,被称为属性,任 ...

  5. Java学习第二篇:类,对象,成员属性,成员方法,构造方法,类变量,类方法

    一.类的定义 一个全面的类定义是比较复杂的,  定义如下:

  6. (转)一步一步学习PHP(5)——类和对象

    OO的强大我不想再多说,如果你不认同OO,那么当你放眼当前流行的语言,有哪个又不支持OO的,也许这个很有说服力了吧. 在这一节中,我们就来看看在PHP中如何创建一个类和对象. 1. 创建类 在PHP中 ...

  7. Java学习笔记之——类与对象

    1.参数的传递方式 1)值传递 2)引用传递 2.类和对象: (1)类的定义: public class 类名{ 类型 属性1: 类型 属性2: ……… public 返回值类型 方法名1(形参){ ...

  8. Scala学习随笔——深入类和对象

    函数化对象(又称方程化对象)指的是所定义的类或对象不包含任何可以修改的状态. 本篇随笔就是着重记录函数化对象.定义了一个有理数类定义的几个不同版本,以介绍 Scala 类定义的几个特性:类参数和构造函 ...

  9. java学习(2):类和对象

     一.类 类可以看成是创建对象的模板,它描述一类对象的行为和状态.创建对象也叫类的实例化.类必须先定义才能使用. 通过下面一个简单的类来理解下Java中类的定义: public class Dog { ...

随机推荐

  1. SQL sum case when then else【转】

    数据库 t 表     b 表内容        Id        Name      胜负        1          张三     胜        2          李四     ...

  2. javascript 通用loading动画效果

    由于项目中多处要给ajax提交的时候增加等待动画效果,所以就写了一个简单的通用js方法: 代码如下: /*ajax提交的延时等待效果*/ var AjaxLoding = new Object(); ...

  3. Spring MVC常用的注解

    @Controller @Controller 负责注册一个bean 到spring 上下文中,bean 的ID 默认为 类名称开头字母小写,你也可以自己指定,如下 方法一: @Controller ...

  4. DB天气app冲刺第六天

    更改计划 以前是准备完全自己写一个天气App 而且加上自己已经成功的做了一个安卓开发的小例子了,就感觉可以做的出来了.结果这五天证明自己一开始的思路就错了.所以上次跟别的同学问了一下.看了一下他们的方 ...

  5. SWFUpload下载地址

    SWFUpload托管在谷歌代码上面,点击下载: https://code.google.com/p/swfupload/

  6. user is not mapped

    用Hibernate实现一个用户的登陆过程,当我在JSP的登陆页面输入姓名和密码,点登陆后,显示登陆失败页,在服务器里显示如下的错误信息:  org.hibernate.hql.ast.QuerySy ...

  7. 关于如何学好游戏3D引擎编程的一些经验[转]

    此篇文章献给那些为了游戏编程不怕困难的热血青年,它的神秘要我永远不间断的去挑战自我,超越自我,这样才能攀登到游戏技术的最高峰 ——阿哲VS自己 QQ79134054多希望大家一起交流与沟通 这篇文章是 ...

  8. JavaScript: top对象

    一般的JS书里都会在讲框架集的时候讲top,这会让人误解,认为top对象只是代表框架集,其实top的含义应该是说浏览器直接包含的那一个页面对象,也就是说如果你有一个页面被其他页面以iframe的方式包 ...

  9. JavaScript中的Function类型浅析

    1. Function类型是js中引用类型之一,每个函数实际上都是Function类型的实例对象,具有自己的属性和方法.正因为函数式对象,所以函数名实际上也是一个指向函数对象的指针. 2. 常用的函数 ...

  10. POJ 1236 Network of Schools[连通分量]

    题目链接:http://poj.org/problem?id=1236题目大意:给出N台电脑,电脑间单向连通传送文件问题1.网络中最少放几个文件保证所有电脑都能接受到文件问题2.最少向网络中加几条线保 ...