php获得对象的类型,php 类型(对象)提示
PHP面向對象:類型提示
2010-07-06
PHP是弱類型語言,向方法傳遞參數時候也不太區分類型。這樣的使用會引起很多的問題,PHP開發者認為,這些問題應該是由代碼書寫者在書寫代碼時進行檢驗以避免。
沒有類型提示很危險
下面的代碼可能會出現問題。
01
02
class?NormalUser{
03
/*
04
* 其它相關代碼..省略........
05
*/
06
private?$age;
07
public?function?setAge($_age){
08
$this->age =$_age;
09
}
10
public?function?getAge(){
11
return?$this->age ;
12
}
13
}
14
15
$normalUser?=new?NormalUser();
16
$normalUser->setAge("I am tom");//這里我們傳輸一個非數值.
17
echo?"age is "?.$normalUser->getAge();
18
19
//注意輸出結果不是我想要的類型.
20
?>
程序運行結果:
1
age is I am tom
原始類型的類型判斷
PHP中提供了一些函數,來判斷數值的類型。我們可使用is_numeric()。判斷是否是一個數值或者可轉換為數值的字符串。
其它相關的還有is_bool()、is_int()、is_float()、is_integer()、is_numeric()、is_string()、is_array() 和 is_object()。
于是代碼有了修改:
01
02
class?NormalUser{
03
/*
04
* 其它相關代碼..省略........
05
*/
06
private?$age;
07
public?function?setAge($_age){
08
if(is_numeric($_age)){
09
$this->age =$_age;
10
}
11
}
12
public?function?getAge(){
13
return?$this->age ;
14
}
15
}
16
17
$normalUser?=new?NormalUser();
18
$normalUser->setAge("I am tom");//這里我們傳輸一個非數值.
19
echo?"age is "?.$normalUser->getAge();//看到這里的結果為空.
20
echo??"
";
21
$normalUser->setAge("100");
22
echo?"age is ".$normalUser->getAge();// 這里就有了結果.
23
?>
程序運行結果:
1
age is
2
age is 100
向方法內傳遞對象
如果傳遞的參數是一個對象呢?下面的代碼用起來很正常。
01
02
class?NormalUser {
03
private?$name;
04
public?function?setName($_name){
05
$this->name =$_name;
06
//這里有存入數據庫等等代碼....
07
}
08
public?function?getName(){
09
return?$this->name;
10
}
11
}
12
13
class?UserAdmin{
14
//這里定義的參數,第一個是User類的實例,第二是要設置的名字.
15
public?static?function?changeName($_user,$_name){
16
$_user->setName($_name);
17
}
18
}
19
20
$normalUser?=new?NormalUser();
21
UserAdmin::changeName($normalUser,"Tom");
22
echo?"userName is "?.$normalUser->getName();
23
24
?>
程序運行結果:
1
userName is Tom
我們還有一個類,和圖書相關的類,在圖書類中也可以設置圖書的書名setName($name)。
如果我向,剛才代碼中的方法changeName() 中傳入一個Book的實例,原定于改變人名的方法現在改變了書的書名。
這有什么風險?能把臟衣服扔到洗衣機里面去洗,同樣的清洗,把盤子和碗都扔進洗衣機里面洗洗試試。
下面的代碼演示我們不想看到的一幕。
01
02
class?NormalUser{
03
private?$name;
04
public?function?setName($_name){
05
$this->name =$_name;
06
}
07
public?function?getName(){
08
return?$this->name;
09
}
10
}
11
12
class?Book{
13
private?$bookName;
14
public?function?setName($_name){
15
$this->bookName =$_name;
16
}
17
public?function?getName(){
18
return?$this->bookName;
19
}
20
}
21
22
class?UserAdmin{
23
public?static?function?changeName($_user,$_name){
24
$_user->setName($_name);
25
}
26
}
27
28
$book?=new?Book();
29
UserAdmin::changeName($book,"Tom");
30
echo?"bookName is "?.$book->getName();
31
32
?>
程序運行結果:
1
bookName is Tom
類型提示保障數據安全
為了避免對象類型不規范引起的問題,PHP5中引入了類型提示這個概念。
在定義方法參數時,同時定義參數的對象類型。
如果在調用的時候,傳入參數的類型不對會報錯。這樣保證了數據的安全性。
01
02
class?NormalUser {
03
private?$name;
04
public?function?setName($_name){
05
$this->name =$_name;
06
}
07
public?function?getName(){
08
return?$this->name;
09
}
10
}
11
12
class?UserAdmin{
13
public?static?function?changeName(NormalUser$_user,$_name){
14
$_user->setName($_name);
15
}
16
}
17
UserAdmin::changeName("anyType","Tom");
18
?>
程序運行結果:
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 221and?defined in E:\PHPProjects\NowaMagic\php\php_TypeTips.php on line 217
建議在定義方法參數時,要使用類型提示。
如果類型不是對象,要采用代碼進行類型建議,以增強安全性。
原文(http://www.nowamagic.net/php/php_TypeTips.php)
總結
以上是生活随笔為你收集整理的php获得对象的类型,php 类型(对象)提示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ae中心点重置工具_AE中图形绘制的6大
- 下一篇: centos命令行安装mysql_Cen