|
前言
在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 | 文章出處 |
|