关于PHP的数据类型(二)

php数据类型-字符串

string (字符串):
一个字符串由一系列的字符组成,其中每个字符等同于一个字节。这意味着PHP只能支持 256 的字符集,因此不支持 Unicode;

string 类型最大可以达到 2GB;

字符串的三种表达方式:

  • 单引号
  • 双引号
  • heredocnowdoc
  1. 单引号:定义一个字符串的最简单的方法是用单引号把他包围起来(字符);
  • 单引号不能解析变量;
  • 单引号只能解析单引号和反斜线本身;
  • 变量与变量,变量与字符串之间,字符串与字符串之间使用 . 来连接;
  1. 双引号:定义一个字符串也可以使用双引号将它包围起来(字符);
  • 双引号可以解析变量,变量可以使用特殊字符和 {} 包含;
  • 双引号可以解析所有的转移字符;
  • 变量与变量,变量与字符串之间,字符串与字符串之间使用 . 来连接;

效率:单引号的效率要高于双引号;

双引号里的变量会经过编译器解释,然后在输出,单引号直接输出;

example1.php

//单引号实例
<?php
echo 'this is a simple string';

// 可以录入多行
echo 'You can also have embedded newlines in 
strings this way as it is
okay to do';

// 输出: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';

// 输出: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';

// 输出: You deleted C:\*.*?
echo 'You deleted C:\*.*?';

// 输出: This will not expand: \n a newline
echo 'This will not expand: \n a newline';

// 输出: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>

example2.php

<?php
//双引号实例
$a = 123;
$str = "abcd{$a}efg";  //双引号可以解析变量,使用 {} 将变量括起来。 {} 不会输出;
$str1 = 'abcd@$a@efg'; //可以使用特殊字符将变量括起来,但是特殊字符会输出  abcd@123@efg
$str2 = "abcd'$a'efg"; // 双引号中有单引号,此种情况变量可以被解析,同时单引号也会输出  abcd'123'efg;
?>
  1. heredocnowdoc:
    表达字符串的方法是用 heredoc 句法结构:<<< 在该运算符之后要提供一个标识符,然后换行。 接下来是字符串本身,最后要用前面定义的标识符作为结束标志。 结束时所引用的标识符 必须 在该行的第一列,而且,标识符的命名也要像其它标签一样遵守 PHP 的规则:只能包含字母、数字和下划线,并且必须以字母和下划线作为开头;

注意:要注意的是结束标识符这行除了可能有一个分号(;)外,绝对不能包含其它字符;

heredoc 类似于 双引号,字符串中 可以 解析变量,但是 不可以 转移字符;(就像没有使用双引号"" 的双引号字符串)

example3.php

<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

/* 含有变量的更复杂示例 */
class foo
{
    var $foo;
    var $bar;

    function foo()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = 'MyName';

echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>

以上会输出:
My name is "MyName". I am printing some Foo.
Now, I am printing some Bar2.
This should print a capital 'A': A

  • 可以把 heredoc 结构用在函数参数中来传递数据:
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>
  • 可以用 heredoc 结构来初始化静态变量和类属性和常量:
<?php
// 静态变量
function foo()
{
    static $bar = <<<LABEL
Nothing in here...
LABEL;
}

// 类的常量、属性
class foo
{
    const BAR = <<<FOOBAR
Constant example
FOOBAR;

    public $baz = <<<FOOBAR
Property example
FOOBAR;
}
?>
  • 可以在 heredoc 结构中使用双引号来声明标识符:
<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
?>

Nowdoc 结构:
Nowdoc 结构是类似于单引号字符串的。但是 nowdoc 中不进行解析操作;这种结构很适合用于嵌入 PHP 代码或其它大段文本而无需对其中的特殊字符进行转义;一个 nowdoc 结构也用和 heredocs 结构一样的标记 <<<, 但是跟在后面的标识符要用单引号括起来,即 <<<'EOT'。

example4.php

<?php
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;

/* 含有变量的更复杂的示例 */
class foo
{
    public $foo;
    public $bar;

    function foo()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = 'MyName';

echo <<<'EOT'
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41
EOT;
?>

以上会输出:
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41

  • nowdoc 结构可以用在任意的静态数据环境中,最典型的示例是用来初始化类的属性或常量;
<?php
class foo {
    public $bar = <<<'EOT'
bar
EOT;
}
?>
  • 变量解析:

当字符串用 双引号heredoc 结构定义时,其中的变量将会被解析。

  • 存取和修改字符串中的字符:

string 中的字符可以通过一个从 0 开始的下标,用类似 array 结构中的方括号包含对应的数字来访问和修改,比如 $str[42]。可以把 string 当成字符组成的 array;也可用 花括号 访问,比如 $str{42}

注意

  • 超出 字符串长度的下标写入将会 拉长该字符串以空格 填充。
  • 非整数 类型下标会被 转换成整数
  • 非法下标 类型会产生一个 E_NOTICE 级别错误。
  • 负数下标 写入字符串时会产生一个 E_NOTICE 级别错误,用 负数下标读取 字符串时返回 空字符串
  • 写入 时只用到了赋值字符串的 第一个 字符。
  • 空字符串赋值 则赋给的值是 NULL 字符。
  • 字符串 在内部是字节组成的数组。 因此用花括号访问或修改字符串对多字节字符集很 不安全 。仅应对单字节编码例如 ISO-8859-1 的字符串进行此类操作。

example5.php

<?php
// 取得字符串的第一个字符
$str = 'This is a test.';
$first = $str[0];

// 取得字符串的第三个字符
$third = $str[2];

// 取得字符串的最后一个字符
$str = 'This is still a test.';
$last = $str[strlen($str)-1]; 

// 修改字符串的最后一个字符
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';

?>

字符串下标 必须为整数可转换为整数的字符串,否则会发出 警告。之前类似 "foo" 的下标会无声地转换成 0

转换成字符串:

一个值可以通过在其前面加上 (string) 或者使用 strval() 函数来转变成字符串;

  • 一个布尔值 booleanTRUE 被转换成 string"1"BooleanFALSE 被转换成 ""(空字符串)。这种转换可以在 booleanstring 之间相互进行。
  • 一个整数 integer 或浮点数 float 被转换为数字的字面样式的 string(包括 float 中的指数部分)。使用指数计数法的浮点数(4.1E+6)也可转换。
  • 数组 array 总是转换成字符串 "Array",因此,echoprint 无法显示出该数组的内容。要显示某个单元,可以用 echo $arr['foo'] 这种结构。
  • 对象 object 总是被转换成字符串 "Object"
  • 资源 resource 总会被转变成 "Resource id #1"这种结构的字符串,其中的 1 是 PHP 在运行时分配给该 resource 的唯一值。
  • NULL 总是被转变成 空字符串

直接把 arrayobjectresource 转换成 string 不会得到除了其类型之外的任何有用信息。可以使用函数 print_r()var_dump() 列出这些类型的内容。

大部分的 PHP 值可以转变成 string 来永久保存,这被称作串行化,可以用函数 serialize() 来实现。如果 PHP 引擎设定支持 WDDX,PHP 值也可被串行化为格式良好的 XML 文本。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容