php基础类

本文详细介绍了PHP中对象和类的使用方法,包括对象初始化、类的定义与使用、常量定义、抽象类概念等核心内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对象初始化

要初始化一个对象,用 new 语句将对象实例到一个变量中。

<?php
class foo
{
    function
do_foo()
    {
        echo
"Doing foo.";
    }
}

$bar = new foo;
$bar->do_foo();
?>

完整的讨论见类与对象一章。

转换为对象

如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,内置类 stdClass 的一个实例将被建立。如果该值为NULL,则新的实例为空。数组转换成对象将使键名成为属性名并具有相对应的值。对于任何其它的值,名为scalar 的成员变量将包含该值。

<?php
$obj
= (object) 'ciao';
echo
$obj->scalar// outputs 'ciao'
?>

 

 

语法

可以用 define() 函数来定义常量。一个常量一旦被定义,就不能再改变或者取消定义。

常量只能包含标量数据(booleanintegerfloatstring)。

可以简单的通过指定其名字来取得常量的值,不要在常量前面加上$ 符号。如果常量名是动态的,也可以用函数 constant() 来读取常量的值。用get_defined_constants() 可以获得所有已定义的常量列表。

注: 常量和(全局)变量在不同的名字空间中。这意味着例如 TRUE$TRUE 是不同的。

如果使用了一个未定义的常量,PHP 假定想要的是该常量本身的名字,如同用字符串调用它一样(CONSTANT 对应 "CONSTANT")。此时将发出一个 E_NOTICE 级的错误。参见手册中为什么 $foo[bar] 是错误的(除非事先用 define()bar 定义为一个常量)。如果只想检查是否定义了某常量,用 defined() 函数。

常量和变量不同:

  • 常量前面没有美元符号($);

  • 常量只能用 define() 函数定义,而不能通过赋值语句;

  • 常量可以不用理会变量范围的规则而在任何地方定义和访问;

  • 常量一旦定义就不能被重新定义或者取消定义;

  • 常量的值只能是标量。

 

例子 13-2. 定义常量

<?php
define
("CONSTANT", "Hello world.");
echo
CONSTANT; // outputs "Hello world."
echo Constant; // outputs "Constant" and issues a notice.
?>

类是变量与作用于这些变量的函数的集合。变量通过var来定义,函数通过 function 来定义,而类则通过下面的语法定义:

<?php
class Cart {
    var
$items// 购物车中的物品

    // 将 $num 个 $artnr 物品加入购物车

   
function add_item($artnr, $num) {
       
$this->items[$artnr] += $num;
    }

   
// 将 $num 个 $artnr 物品从购物车中取出

   
function remove_item($artnr, $num) {
        if (
$this->items[$artnr] > $num) {
           
$this->items[$artnr] -= $num;
            return
true;
        } elseif (
$this->items[$artnr] == $num) {
            unset(
$this->items[$artnr]);
            return
true;
        } else {
            return
false;
        }
    }
}
?>

上面的例子定义了一个 Cart 类,这个类由购物车中的商品构成的数组和两个用于从购物车中添加和删除商品的函数组成。

Warning

不能将一个类的定义分割到多个文件中。也不能将一个类的定义分割到多个 PHP 块中,除非该分割是在一个方法声明内部。以下用法将不起作用:

<?php
class test {
?>
< ?php
   
function test() {
        print
'OK';
    }
}
?>

但是以下用法是可以的:

<?php
class test {
    function
test() {
       
?>
        <?php
       
print 'OK';
    }
}
?>

以下警告仅用于 PHP 4。

Caution

名称 stdClass 已经被 Zend 使用并保留。不能在 PHP 代码中定义名为 stdClass 的类。

Caution

函数名 __sleep __wakeup 在 PHP 类中是魔术函数。除非想要与之联系的魔术功能,否则在任何类中都不能以此命名函数。

Caution

PHP 将所有以 __ 开头的函数名保留为魔术函数。除非想要使用一些见于文档中的魔术功能,否则建议不要在 PHP 中将函数名以 __ 开头。

在 PHP 4 中,var 变量的值只能初始化为常量。用非常量值初始化变量,需要一个初始化函数,该函数在对象被创建时自动被调用。这样一个函数被称之为构造函数(见下面)。

<?php
/* PHP 4 中不能这样用 */
class Cart {
    var
$todays_date = date("Y-m-d");
    var
$name = $firstname;
    var
$owner = 'Fred ' . 'Jones';
   
/* 不过包含有常量的数组可以 */
   
var $items = array("VCR", "TV");
}

/* 应该这样进行 */
class Cart {
    var
$todays_date;
    var
$name;
    var
$owner;
    var
$items = array("VCR", "TV");
    function
Cart() {
       
$this->todays_date = date("Y-m-d");
       
$this->name = $GLOBALS['firstname'];
       
/* etc. . . */
   
}
}
?>

类也是一种类型,就是说,它们是实际变量的蓝图。必须用 new 运算符来创建相应类型的变量。

<?php
$cart
= new Cart;
$cart->add_item("10", 1);

$another_cart = new Cart;
$another_cart->add_item("0815", 3);
?>

上述代码创建了两个 Cart 类的对象 $cart $another_cart,对象 $cart 的方法 add_item() 被调用时,添加了 1 件 10 号商品。对于对象$another_cart,3 件 0815 号商品被添加到购物车中。

$cart $another_cart 都有方法 add_item(),remove_item() 和一个 items 变量。它们都是明显的函数和变量。可以把它们当作文件系统中的某些类似目录的东西来考虑。在文件系统中,可以拥有两个不同的 README.TXT 文件,只要不在相同的目录中。正如从为了根目录访问每个文件需要输入该文件的完整的路径名一样,必须指定需要调用的函数的完整名称:在 PHP 术语中,根目录将是全局名字空间,路径名符号将是 ->。因而,名称 $cart->items $another_cart->items 命名了两个不同的变量。注意变量名为 $cart->items,不是 $cart->$items,那是因为在 PHP 中一个变量名只有一个单独的美元符号。

<?php
// 正确,只有一个 $
$cart->items = array("10" => 1);

// 不正确,因为 $cart->$items 变成了 $cart->""
$cart->$items = array("10" => 1);

// 正确,但可能不是想要的结果:
// $cart->$myvar 变成了 $cart->items
$myvar = 'items';
$cart->$myvar = array("10" => 1);
?>

在定义类的时候,无法得知将使什么名字的对象来访问:在编写 Cart 类时,并不知道之后对象的名称将会命名为 $cart 或者 $another_cart,还是什么其它的名字。因而你不能在类中使用 $cart->items。然而为了类定义的内部访问自身的函数和变量,可以使用伪变量 $this 来达到这个目的。$this 变量可以理解为“我自己的”或者“当前对象”。因而 '$this->items[$artnr] += $num' 可以理解为“我自己的物品数组的 $artnr计数器加 $num”或者“在当前对象的物品数组的 $artnr 计数器加 $num”。

Note:

伪变量 $this 通常未定义,如果其所在的方法是被静态调用的话。但这不是个严格规定:如果一个方法被从另一个对象内静态调用的话,则$this 会被定义。此时 $this 的值是那个发出调用的对象。用下例演示:

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

以上例程会输出:

$this is defined (a)
$this is not defined.
$this is defined (b)
$this is not defined.

类本身就已经很抽象了,为什么还要引入抽象类的概念呢?引入抽象类的作用是什么?
有以下代码:

  1. <?php 
  2.  
  3.  
  4. class Animal 
  5.      
  6.     public function 叫() 
  7.     { 
  8.         echo '叫'
  9.     } 
  10. class Dog extends Animal 
  11.  
  12.  
  13.     public function 叫() 
  14.     { 
  15.         echo '汪汪'
  16.     } 
  17. class Cat extends Animal 
  18. { public function 叫() 
  19. { echo '喵呜'; }} 
  20.  
  21. ?> 
<?php


class Animal
{
    
    public function 叫()
    {
        echo '叫';
    }
}
class Dog extends Animal


{
    public function 叫()
    {
        echo '汪汪';
    }
}
class Cat extends Animal
{ public function 叫()
{ echo '喵呜'; }}

?>





看到没有,父类有个函数叫,而子类都继承了这个方法,因为动物不一样,所以叫声不一样。所以父类中的叫函数的实现是多余的了。为了解决这个问题,抽象类出现了。抽象类就是只能声明,不被实现。
PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。


继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。 这也适用于 PHP 5.4 起的构造函数。在 PHP 5.4 之前的构造函数声明可以不一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值