ScarShow

< IS >

PHP 字串連接

2013-04-02  /  IT  /  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  |