01-看官方文档学PHP面向对象-基础篇

原来是通过java入门了面向对象,当时非常熟练的掌握java,现在基本忘光,在学java的时候就想学php,现在自学php

The Basics

class

类:

class classname
{
// 定义属性
// 定义方法
}
  1. 类名不能是保留字,以字母或下划线开头,以正则表达式表示为:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

  2. 类可以包含属于自己的 常量, 变量(或属性) 及函数(或方法)

    A class may contain its own constants, variables (called “properties”), and functions (called “methods”).

<?php
// 显示所有错误
error_reporting(E_ALL);
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()
{
// Note: the next line will issue a warning if E_STRICT is enabled.
A::foo();
}
}

$a = new A();
$a->foo(); // 因为new了一个A()对象出来,所以输出: $this is defined (A)

// Note: the next line will issue a warning if E_STRICT is enabled.
A::foo(); // 静态调用时无A()对象,所以输出 $this is not defined.
$b = new B(); // 实例化了一个B()的对象
// 这里是对象$b 调用 B类的bar()方法, $b这个对象调用方法就会调用 A::foo()方法, 此时A::foo()中的$this实际上是上一句生成的B()的对象
$b->bar(); //所以应该输出: $this is defined (B)
// Note: the next line will issue a warning if E_STRICT is enabled.
B::bar(); // 纯静态调用,是类在调用这个方法,输出 $this is not defined.


// 最终结果: $this is defined (A) $this is not defined. $this is defined (B) $this is not defined.
?>

new

$instance = new SimpleClass();

// 也可以这样做:
$className = 'Foo';
$instance = new $className(); // Foo()
<?php
class SimpleClass
{
// property declaration
public $var = 'a default value';

// method declaration
public function displayVar() {
echo $this->var;
}
}

$instance = new SimpleClass();

$assigned = $instance; // 此时两个引用指向同一个内存里实例化成功的SimpleClass对象.
$reference =& $instance; // 此时 $reference 和 $instance的引用相同了,=&意味着他们两个的引用地址相同

$instance->var = '$assigned will have this value';

$instance = null; // $instance and $reference become null

var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>

输出结果:

NULL
NULL
object(SimpleClass)#1 (1) {
["var"]=>
string(30) "$assigned will have this value"
}

PHP 5.3.0 开始,引入了新的方法来创建实例.

<?php
class Test
{
static public function getNew()
{
return new static;
}
}

class Child extends Test
{}

$obj1 = new Test();
$obj2 = new $obj1; // 此法甚秒
var_dump($obj1 !== $obj2);

$obj3 = Test::getNew(); // 此法甚好
var_dump($obj3 instanceof Test);

$obj4 = Child::getNew();
var_dump($obj4 instanceof Child);
?>

extends

  1. 可以在声明中用 extends 关键字继承另一个类;
  2. PHP不支持多重继承,一个类只能继承一个基类。
  3. 被继承的方法和属性可以通过用同样的名字重新声明被覆盖。
  4. 如果父类定义方法时使用了 final,则该方法不可被覆盖。
  5. 可以通过 parent:: 来访问被覆盖的方法或属性。
  6. 当覆盖方法时,参数必须保持一致否则 PHP 将发出 E_STRICT 级别的错误信息。
  7. 构造函数可在被覆盖时使用不同的参数。
<?php
class ExtendClass extends SimpleClass
{
// Redefine the parent method
function displayVar()
{
echo "Extending class\n";
parent::displayVar();
}
}

$extended = new ExtendClass();
$extended->displayVar();
?>

::class

  1. 自 PHP 5.5 起,关键词 class 也可用于类名的解析。
  2. ClassName::class可以得到一个字符串,包含了类 ClassName 的完全限定名称:NS\ClassName
<?php
namespace NS {
class ClassName {
}

echo ClassName::class;
}
?>
0%