php 显示对像编码,PHP面向对象之旅:类型提示
PHP是弱類型語言,向方法傳遞參數(shù)時候也不太區(qū)分類型。這樣的使用會引起很多的問題,PHP開發(fā)者認為,這些問題應(yīng)該是由代碼書寫者在書寫代碼時進行檢驗以避免。
沒有類型提示很危險
下面的代碼可能會出現(xiàn)問題。
class NormalUser{
/*
* 其它相關(guān)代碼..省略........
*/
private $age;
public function setAge($_age){
$this->age = $_age;
}
public function getAge(){
return $this->age ;
}
}
$normalUser = new NormalUser();
$normalUser->setAge("I am tom"); //這里我們傳輸一個非數(shù)值.
echo "age is " .$normalUser->getAge();
//注意輸出結(jié)果不是我想要的類型.
?>
程序運行結(jié)果:
age is I am tom
原始類型的類型判斷
PHP中提供了一些函數(shù),來判斷數(shù)值的類型。我們可使用is_numeric()。判斷是否是一個數(shù)值或者可轉(zhuǎn)換為數(shù)值的字符串。
其它相關(guān)的還有is_bool()、is_int()、is_float()、is_integer()、is_numeric()、is_string()、is_array() 和 is_object()。
于是代碼有了修改:
class NormalUser{
/*
* 其它相關(guān)代碼..省略........
*/
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"); //這里我們傳輸一個非數(shù)值.
echo "age is " .$normalUser->getAge();//看到這里的結(jié)果為空.
echo "
";
$normalUser->setAge("100");
echo "age is ".$normalUser->getAge();// 這里就有了結(jié)果.
?>
程序運行結(jié)果:
age is
age is 100
向方法內(nèi)傳遞對象
如果傳遞的參數(shù)是一個對象呢?下面的代碼用起來很正常。
class NormalUser {
private $name;
public function setName($_name){
$this->name = $_name;
//這里有存入數(shù)據(jù)庫等等代碼....
}
public function getName(){
return $this->name;
}
}
class UserAdmin{
//這里定義的參數(shù),第一個是User類的實例,第二是要設(shè)置的名字.
public static function changeName($_user,$_name){
$_user->setName($_name);
}
}
$normalUser = new NormalUser();
UserAdmin::changeName($normalUser,"Tom");
echo "userName is " . $normalUser->getName();
?>
程序運行結(jié)果:
userName is Tom
我們還有一個類,和圖書相關(guān)的類,在圖書類中也可以設(shè)置圖書的書名setName($name)。
如果我向,剛才代碼中的方法changeName() 中傳入一個Book的實例,原定于改變?nèi)嗣姆椒ìF(xiàn)在改變了書的書名。
這有什么風險?能把臟衣服扔到洗衣機里面去洗,同樣的清洗,把盤子和碗都扔進洗衣機里面洗洗試試。
下面的代碼演示我們不想看到的一幕。
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();
?>
程序運行結(jié)果:
bookName is Tom
類型提示保障數(shù)據(jù)安全
為了避免對象類型不規(guī)范引起的問題,PHP5中引入了類型提示這個概念。
在定義方法參數(shù)時,同時定義參數(shù)的對象類型。
如果在調(diào)用的時候,傳入?yún)?shù)的類型不對會報錯。這樣保證了數(shù)據(jù)的安全性。
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");
?>
程序運行結(jié)果:
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
建議在定義方法參數(shù)時,要使用類型提示。
如果類型不是對象,要采用代碼進行類型建議,以增強安全性。
延伸閱讀
此文章所在專題列表如下:
總結(jié)
以上是生活随笔為你收集整理的php 显示对像编码,PHP面向对象之旅:类型提示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java http get_我是如何进入
- 下一篇: springboot dubbo引入包_