PHP类与对象

PHP中的类与对象

简介

PHP 5完全重写了对象模型以得到更佳性能和更多特性,具有完整的对象模型。

PHP 对待对象的方式与引用和句柄相同,即每个变量都持有对象的引用,而不是整个对象的拷贝。

我们都知道PHP对象赋值默认情况下是通过引用传递的,但这并不完全正确。

比如:

class A {
   public $i = 1;
}

$a = new A();

$b = $a ;  //此时,$a,$b是同一个标识符的拷贝,即 ($a) = ($b) = <id>

$c = &$a; //此时,$a,$b是引用 即 ($c,$d) = <id>

function foo($obj){
   $obj->i = 2 ;
}

foo($a);  //此时传递$a 对象,是标识符拷贝 ,即  // ($obj) = ($e) = <id>

类型提示

PHP是弱类型语言,向方法传递参数时候也不太区分类型。这样的使用会引起很多的问题,PHP开发者认为,这些问题应该是由代码书写者在书写代码时进行检验以避免。
没有类型提示很危险

下面的代码可能会出现问题。


class NormalUser{

    /*

    * 其它相关代码..省略........

    */

    private $age;

    public function setAge($_age){

        $this->age = $_age;

    }  

    public function getAge(){

        return $this->age ;

    }

}

$normalUser = new NormalUser();

$normalUser->setAge("I am ycp"); //这里我们传输一个非数值.

echo "age is " .$normalUser->getAge();

//注意输出结果不是我想要的类型.

?>
程序运行结果:
1

age is I am ycp

原始类型的类型判断

PHP中提供了一些函数,来判断数值的类型。我们可使用is_numeric()。判断是否是一个数值或者可转换为数值的字符串。
其它相关的还有is_bool()、is_int()、is_float()、is_integer()、is_numeric()、is_string()、is_array() 和 is_object()
于是代码有了修改:



<?

class NormalUser{

    /*

    * 其它相关代码..省略........

    */

    private $age;

    public function setAge($_age){

        if(is_numeric($_age)){

          $this->age = $_age;


    }  

    public function getAge(){

        return $this->age ;

    }

}


$normalUser = new NormalUser();

$normalUser->setAge("I am tom"); //这里我们传输一个非数值.

echo "age is " .$normalUser->getAge();//看到这里的结果为空.

echo  "<br>";

$normalUser->setAge("100");

echo "age is ".$normalUser->getAge();// 这里就有了结果.

?>

程序运行结果:

1
age is
2
age is 100

向方法内传递对象

如果传递的参数是一个对象呢?下面的代码用起来很正常。



<?

class NormalUser {

    private $name;

    public function setName($_name){

        $this->name = $_name;


    }

    public function getName(){

        return $this->name;

    }

}


class UserAdmin{

    //这里定义的参数,第一个是User类的实例,第二是要设置的名字.

    public static function changeName($_user,$_name){

        $_user->setName($_name);

    }
}

$normalUser = new NormalUser();

UserAdmin::changeName($normalUser,"Tom");


echo "userName is " . $normalUser->getName();


?>

程序运行结果:

1
userName is Tom

我们还有一个类,和图书相关的类,在图书类中也可以设置图书的书名setName($name)。
如果我向,刚才代码中的方法changeName() 中传入一个Book的实例,原定于改变人名的方法现在改变了书的书名。
这有什么风险?能把脏衣服扔到洗衣机里面去洗,同样的清洗,把盘子和碗都扔进洗衣机里面洗洗试试。
下面的代码演示我们不想看到的一幕。

<?

class NormalUser{

    private $name;

    public function setName($_name){

        $this->name = $_name;

    }

    public function getName(){

        return $this->name;

    }

}

 

class Book{

    private $bookName;

    public function setName($_name){

        $this->bookName = $_name;

    }

    public function getName(){

        return $this->bookName;

    }  

}


class UserAdmin{

    public static function changeName($_user,$_name){

        $_user->setName($_name);

    }

}

 

$book = new Book();

UserAdmin::changeName($book,"Tom");

echo "bookName is " . $book->getName();

 

?>

程序运行结果:

1
bookName is Tom
类型提示保障数据安全

为了避免对象类型不规范引起的问题,PHP5中引入了类型提示这个概念。
在定义方法参数时,同时定义参数的对象类型。
如果在调用的时候,传入参数的类型不对会报错。这样保证了数据的安全性。




<?

class NormalUser {

    private $name;

    public function setName($_name){

        $this->name = $_name;

    }

    public function getName(){

        return $this->name;

    }

}


class UserAdmin{

    public static function changeName(NormalUser $_user,$_name){

        $_user->setName($_name);

    }

}

UserAdmin::changeName("anyType","Tom");

?>

程序运行结果:

1
Catchable fatal error: Argument 1 passed to UserAdmin::changeName() must be an instance of NormalUser, string given, called in E:\PHPProjects\NowaMagic\php\php_TypeTips.php on line 221 and defined in E:\PHPProjects\NowaMagic\php\php_TypeTips.php on line 217

建议在定义方法参数时,要使用类型提示。
如果类型不是对象,要采用代码进行类型建议,以增强安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值