PHP 字串連接
前言
在PHP中字串連接的方法與其它的語言有著非常的不同,我們都知道以C語言來說我們可以使用函式strcat()
來連接兩個字元陣列,而在Java中我們可以使用+
運算子來做字串的連接。
而PHP呢?PHP不同與上述語言,它則使用.
運算子來連接字串,而且除了.
以外還有許多不同的方式也可以連接字串。
基本使用
字串宣告
在PHP當中可以使用'
或者是"
來宣告字串,但是這兩個符號宣告出的字串其實是不相同的。
<?php
$str = "Hi, I am Tony.\nNice to meet you.";
echo $str;
// Hi, I am Tony.
// Nice to meet you.
$str = 'Hi, I am Tony.\nNice to meet you.';
echo $str;
// Hi, i am Tony,\nNice to meet you.
由上面範例可以得知使用"
宣告的字串可以讓跳脫字元發揮出作用,而使用'
宣告的字串則是純字串你輸入什麼就輸出什麼。
字串連接
<?php
$name = 'Tony';
echo "Hi " . $name; // Hi Tony
echo 'Hi ' . $name; // Hi Tony
echo "Hi $name"; // Hi Tony
echo 'Hi $name'; // Hi $name
那麼字串與變數的連接,在"
可以很彈性的使用變數,而'
只能夠使用.
來做連接,而兩者都可以使用格式化輸出sprintf()
但這邊就先不提。
由上面得知"
可以很彈性的連接變數,那麼它除了變數的連接外,那與陣列、函式以及物件之間該如何連接以及可行性?我們看下面的範例。
陣列範例
<?php
$color = array('black', 'blue');
echo "The sky is $color[1]"; // The sky is blue
echo "The sky is {$color[1]}"; // The sky is blue
echo "The sky is" . $color[1]; // The sky is blue
$student = array('name' => 'Tony', 'age' => 18);
echo "I am $student['name']"; // Error
echo "I am {$student['name']}"; // I am Tony
echo "I am " . $student['name']; // I am Tony
如果輸出以字串當作索引值的陣列時就必須使用{ }
將變數跳脫。
函式範例
<?php
function getName() {
return 'Tony';
}
echo "My name is getName()"; // Error: My name is name()
echo "My name is {getName()}"; // Error: My name is {name()}
echo "My name is " . getName(); // My name is Tony
$name = 'getName';
echo "My name is $name()"; // Error: My name is getName()
echo "My name is {$name()}"; // My name is Tony
echo "My name is " . $name(); // My name is Tony
當輸出函式時並沒辦法使用{ }
將函式跳脫,所以還是只能用.
來做字串連接,但是以變數為名的還是可以使用{ }
來做跳脫。
物件範例
<?php
class Student {
private static $type = 'student';
private $name;
private $age;
public function __construct($n, $a) {
$this->name = $n;
$this->age = $a;
// Class Variable
echo "I am $this->age years old"; // I am 18 years old
echo "I am {$this->age} years old"; // I am 18 years old
echo "I am " . $this->age . " years old"; // I am 18 years old
// Class Static Variable
echo "I am self::$type"; // Error: I am self::
echo "I am {self::$type}"; // Error: I am {self::}
echo "I am " . self::$type; // I am student
}
public static function getType() {
return self::$type;
}
public function getName() {
return $this->name;
}
public function getAge() {
return $this->age;
}
}
$student = new Student('Tony', 18);
我們寫一個Student物件,其中包含了類型、姓名以及年齡然後我們做個簡單的測試,結果物件的私有變數可以正常輸出,但是遇到了靜態變數時還是要使用.
來做連接。
<?php
$student = new Student('Tony', 18);
// Class Method
echo "I am $student->getAge() years old"; // Error: I am () years old
echo "I am {$student->getAge()} years old"; // I am 18 years old
echo "I am " . $student->getAge() . " years old"; // I am 18 years old
// Class Static Method with Instance
echo "I am $student::getType()"; // Error
echo "I am {$student::getType()}"; // I am student
echo "I am " . $student::getType(); // I am student
// Class Static Method without Instance
echo "I am Student::getType()"; // Error: I am Student::getType()
echo "I am {Student::getType()}"; // Error: I am {Student::getType()}
echo "I am " . Student::getType(); // I am student
承襲上面的物件,我沒從外部去呼叫方法以及靜態方法,擁有實體的方法以及靜態方法可以使用{ }
來做,但是沒有實體的靜態方法還是只能使用.
來做連接。
小結
由上面範例示範了一半可能會遇到到的情況,並且可以得知PHP在字串的連接上與其它與語言比較起來使用上自由許多。雖然自由但是如果是寫網頁程式的話記得對字串消毒,小心被走後門。
綜合以上結果整理一下幾種輸出方式,見下表:
" {} .
--------------------------------------
$var | OK | OK | OK |
$array[0] | OK | OK | OK |
$array['key'] | | OK | OK |
--------------------------------------
function() | | | OK |
$function() | | OK | OK |
--------------------------------------
$this->var | OK | OK | OK |
self::$var | | | OK |
--------------------------------------
$class->func() | | OK | OK |
$class::func() | | OK | OK |
Static::func() | | | OK |