關於PHP字符串的一道面試題

咱們來看一段簡單的代碼:php

<?php
$str = 'php';
$str['name'] = array('dogstart');
var_dump($str);
複製代碼

認真思索下,上面的代碼會輸出什麼?若是你已經有答案了,那麼就能夠關閉這遍文章了,不然我們一步一步的來看看最終會輸出什麼。數組

基礎回顧

在開始作題前,咱們先來想一想php中存在的變量類型:bash

  • Boolean 布爾類型
  • Integer 整型
  • Float 浮點型
  • String 字符串
  • Array 數組
  • Object 對象
  • Resource 資源類型
  • NULL
  • Callback / Callable類型

參考文檔:PHP類型spa

在PHP中string的實現方式是一個由字節組成的數組再加上一個整數指明緩衝區長度(注意,PHP是不能改變原字符串長度的)。.net

咱們接着來看咱們的題目,第一行代碼很正常,關鍵的部分是在第二行:code

$str['name'] = array('dogstart');
複製代碼

咱們先看等號左邊的代碼,既然PHP的字符串是由數組組成的,咱們知道PHP中數組的key能夠是integer和string,可是在字符串中,咱們只能經過integer 下標來訪問每一個字符,因此這個地方的'name'最終會被轉換成數字:對象

intval('name');
複製代碼

PHP文檔中定義了,字符串轉爲數字時,字符串的開始部分決定了轉換後的值。若是該字符串以合法的數值開始,則使用該數值,不然爲0。資源

因此上面的代碼的最終結果爲0,利用數學中的代入法,第二行的代碼就變成了:文檔

$str[0] = array('dogstar');
複製代碼

咱們接下來再看看第二行右邊的代碼,因爲字符串中只能存在字符串,因此右邊的代碼會被轉換成字符串:字符串

strval(array('dogstar'));
複製代碼

轉換結果爲'Array',這個時候第二行代碼就成了:

$str[0] = 'Array';
複製代碼

因爲字符串長度是固定的,因此這個地方只能存放一個字符,因此'Array'中的字符賦值到$str[0]中只會保留第一個字符,其他的都將被拋棄。因此咱們的代碼就變成了:

<?php
$str = 'php';
$str[0] = 'A';
var_dump($str);
複製代碼

這個時候就能夠一眼看出最終的輸出結果爲'Ahp'。

相關文章
相關標籤/搜索