��������

class

ÿ����Ķ��嶼�Թؼ��� class ��ͷ����������������������һ�Ի����ţ������������������뷽���Ķ��塣

�����������κη� PHP �������ĺϷ���ǩ��һ���Ϸ���������ĸ���»��߿�ͷ���������������ĸ�����ֻ��»��ߡ���������ʽ��ʾΪ��[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*��

һ������԰����������Լ�����������������Ϊ"����"���Լ���������Ϊ"����"����

Example #1 �򵥵��ඨ��

<?php
class SimpleClass
{
    
// ��������
    
public $var 'a default value';

    
// ��������
    
public function displayVar() {
        echo 
$this->var;
    }
}
?>

��һ���������ඨ���ڲ�������ʱ����һ�����õ�α���� $this��$this ��һ�������ж�������ã�ͨ���Ǹ÷����������Ķ��󣬵�����Ǵӵڶ���������̬����ʱҲ��������һ�����󣩡�

Example #2 $this α������ʾ��

We're assuming that error_reporting is disabled for this example; otherwise the following code would trigger deprecated and strict notices, respectively, depending on the PHP version.

<?php
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();
?>

Output of the above example in PHP 5:

$this is defined (A)
$this is not defined.
$this is defined (B)
$this is not defined.

Output of the above example in PHP 7:

$this is defined (A)
$this is not defined.
$this is not defined.
$this is not defined.

new

Ҫ����һ�����ʵ��������ʹ�� new �ؼ��֡��������¶���ʱ�ö������DZ���ֵ�����Ǹö����������캯�������ڳ���ʱ�׳���һ���쳣����Ӧ�ڱ�ʵ����֮ǰ���壨ijЩ������������������

����� new ֮����ŵ���һ���������������ַ��� string��������һ��ʵ���������������������һ�������ռ䣬�����ʹ�����������ơ�

Example #3 ����ʵ��

<?php
$instance 
= new SimpleClass();

// Ҳ������������
$className 'Foo';
$instance = new $className(); // Foo()
?>

���ඨ���ڲ��������� new self �� new parent �����¶���

����һ�������Ѿ�������ʵ������һ���±���ʱ���±��������ͬһ��ʵ�����ͺ��øö���ֵһ��������Ϊ�͸�����������ʵ��ʱһ������������¡��һ���Ѵ����Ķ�����һ����ʵ����

Example #4 ����ֵ

<?php

$instance 
= new SimpleClass();

$assigned   =  $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 �����������·���������һ�������ʵ����

Example #5 �����¶���

<?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);
?>

�������̻������

bool(true)
bool(true)
bool(true)

PHP 5.4.0 �𣬿���ͨ��һ�����ʽ�������´�������ij�Ա��

Example #6 �����´�������ij�Ա

<?php
echo (new DateTime())->format('Y');
?>

�������̵���������ڣ�

2016

Properties and methods

Class properties and methods live in separate "namespaces", so it is possible to have a property and a method with the same name. Referring to both a property and a method has the same notation, and whether a property will be accessed or a method will be called, solely depends on the context, i.e. whether the usage is a variable access or a function call.

Example #7 Property access vs. method call

<?php
class Foo
{
    public 
$bar 'property';
    
    public function 
bar() {
        return 
'method';
    }
}

$obj = new Foo();
echo 
$obj->barPHP_EOL$obj->bar(), PHP_EOL;

�������̻������

property
method

That means that calling an anonymous function which has been assigned to a property is not directly possible. Instead the property has to be assigned to a variable first, for instance. As of PHP 7.0.0 it is possible to call such a property directly by enclosing it in parentheses.

Example #8 Calling an anonymous function stored in a property

<?php
class Foo
{
    public 
$bar;
    
    public function 
__construct() {
        
$this->bar = function() {
            return 
42;
        };
    }
}

$obj = new Foo();

// as of PHP 5.3.0:
$func $obj->bar;
echo 
$func(), PHP_EOL;

// alternatively, as of PHP 7.0.0:
echo ($obj->bar)(), PHP_EOL;

�������̻������

42

extends

һ����������������� extends �ؼ��ּ̳���һ����ķ��������ԡ�PHP��֧�ֶ��ؼ̳У�һ����ֻ�ܼ̳�һ�����ࡣ

���̳еķ��������Կ���ͨ����ͬ���������������������ǡ�����������ඨ�巽��ʱʹ���� final����÷������ɱ����ǡ�����ͨ�� parent:: �����ʱ����ǵķ��������ԡ�

�����Ƿ���ʱ���������뱣��һ�·��� PHP ������ E_STRICT ����Ĵ�����Ϣ�������캯�����⣬���캯�����ڱ�����ʱʹ�ò�ͬ�IJ�����

Example #9 �򵥵���̳�

<?php
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

::class

�� PHP 5.5 �𣬹ؼ��� class Ҳ�����������Ľ�����ʹ�� ClassName::class ����Ի�ȡһ���ַ������������� ClassName ����ȫ�޶����ơ����ʹ���� �����ռ� �����������á�

Example #10 �����Ľ���

<?php
namespace NS {
    class 
ClassName {
    }
    
    echo 
ClassName::class;
}
?>

�������̻������

NS\ClassName

Note:

The class name resolution using ::class is a compile time transformation. That means at the time the class name string is created no autoloading has happened yet. As a consequence, class names are expanded even if the class does not exist. No error is issued in that case.