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. poj 2187 Beauty Contest

    Beauty Contest 题意:给你一个数据范围在2~5e4范围内的横纵坐标在-1e4~1e4的点,问你任意两点之间的距离的最大值的平方等于多少? 一道卡壳凸包的模板题,也是第一次写计算几何的题, ...

  2. Git权威指南 读笔(3)

    第九章 恢复进度: $ git stash list 显示存储的工作进度列表. $ git stash 保存当前的工作进度,分别对暂存区和工作区的状态进行保存. $ git stash pop [-- ...

  3. BZOJ 2124等差子序列 线段树&&hash

    [题目描述 Description] 给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len& ...

  4. The partner transaction manager has disabled its support for remote/network transactions.

    http://technet.microsoft.com/en-us/library/cc753510(WS.10).aspx

  5. 【记录】让人淡疼的BUG之参数传送错误

    前言 面试的时候往往容易被面试官问到:“说说你遇到过的比较重大或经典的Bug有哪些,能说一说吗?”我被问时脑海的反应是:“尼玛,这个我从来没有刻意记!一时半会咋想得起来,然后还是没想起来或者是随意给了 ...

  6. A Full Hardware Guide to Deep Learning

    A Full Hardware Guide to Deep Learning Deep Learning is very computationally intensive, so you will ...

  7. 安卓接入ShareSDK问题

    平台图标错乱原因  导出的jar包 包括了 style.class R$attr.class MainActivity.class R$color.class R$drawable.class R$s ...

  8. HDU 1003 Max Sum(DP)

    点我看题目 题意 : 就是让你从一个数列中找连续的数字要求他们的和最大. 思路 : 往前加然后再判断一下就行. #include <iostream> #include<stdio. ...

  9. SPRING IN ACTION 第4版笔记-第六章Rendering web views-001- Spring支持的View Resolver、InternalResourceViewResolver、JstlView

    一.Spring支持的View Resolver 二.InternalResourceViewResolver Spring supports JSP views in two ways: Inte ...

  10. Linux Kernel ‘drivers/staging/wlags49_h2/wl_priv.c’本地缓冲区溢出漏洞

    漏洞名称: Linux Kernel ‘drivers/staging/wlags49_h2/wl_priv.c’本地缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-068 发布时间: 2 ...