在官方的PHP实现内部,所有变量使用同一种数据结构(zval)来保存,而这个结构同时表示PHP中的各种数据类型。 它不仅仅包含变量的值,也包含变量的类型。这就是PHP弱类型的核心。
标量类型: boolean、integer、float(double)、string
复合类型: array、object
特殊类型: resource、NULL
变量的存储结构
PHP在内核中是通过zval这个结构体来存储变量的,它的定义在Zend/zend.h文件里,简短精炼,只有四个成员组成:
struct _zval_struct { zvalue_value value; /* 变量的值 */ zend_uint refcount__gc; zend_uchar type; /* 变量当前的数据类型 */ zend_uchar is_ref__gc; }; typedef struct _zval_struct zval; //在Zend/zend_types.h里定义的: typedef unsigned int zend_uint; typedef unsigned char zend_uchar;
refcount__gc表示引用计数1
is_ref__gc表示是否为引用0
value存储变量的值
type变量具体的类型
变量的类型
zval结构体的type字段就是实现弱类型最关键的字段,type的值可以为: IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_ARRAY、IS_OBJECT、IS_RESOURCE。 从字面上就很好理解,他们只是类型的唯一标示,根据类型的不同将不同的值存储到value字段。 除此之外,和他们定义在一起的类型还有IS_CONSTANT和IS_CONSTANT_ARRAY。
示例
<?php $foo='bar'; ?>
上面是一段PHP语言的例子,创建一个变量,并把它的值设置为’bar’,步骤: 创建一个zval结构,并设置其类型。 设置值为’bar’。 将其加入当前作用域的符号表,这样用户才能在PHP里使用这个变量 具体的代码为:
{ zval *fooval; MAKE_STD_ZVAL(fooval); ZVAL_STRING(fooval, "bar", 1); ZEND_SET_SYMBOL( EG(active_symbol_table) , "foo" , fooval); }
首先,我们声明一个zval指针,并申请一块内存。然后通过ZVAL_STRING宏将值设置为
<?php $foo='bar'; ?>,最后一行的作用就是将这个zval加入到当前的符号表里去,并将其label定义成foo,这样用户就可以在代码里通过$foo来使用它。
备注
建议好好看看参考2的链接,里面讲了很多关于变量的知识。
参考
http://www.laruence.com/2008/08/12/180.html
https://www.kancloud.cn/nickbai/php7/363267
Laravel秉持MVC的设计理念,在V=view 中放置视图相关的内容。特别是 blade 模板引擎带来了很强大的解析方式。
与传统的PHP与HTML写作一团方式不容,Blade 使用特定的语法结构,将变量数据渲染到视图内。
那么如何优雅地在视图文件里定义一个PHP变量呢?
比如声明一个变量,你完全可以混杂PHP标签的内容:
<?php $old_section="whatever"; ?>
这非常不优雅,不是吗?但是,像下面这样:
{{ $old_section="whatever" }}
会直接输出变量值。这不是想要的结果。在laravel blade 模板里,你应该使用下面的标签
@php
$i=1
@endphp
这样把PHP书写的内容,使用特定的标识符隔开,就达到目的了。当然你还可以使用简写:
@php ($i=1)
这与上方的结构块写法输出结果相同。
换一种思路,如果版本较早,不能支持php结构块,我们可以使用 if 语句块实现,在条件语句内使用赋值写法。如下:
@if ($variable='any data, be it string, variable or OOP') @endif
注意在判断语句内,使用了赋值语句,那么变量 $variable 就被声明且可外部访问了。
这也是曲线救国的一种方式吧。
laravel系统提供了模板的扩展使用系统不具备的标签。我们使用 ServiceProvider 注册一个先的 BaldeServiceProvider,在其中添加 Blade 模板的扩展方法。
首先创建文件
app/Providers/BladeServiceProvider.php
然后添加下面的代码:
我们使用自定义的标签 define 用于声明变量,使用 preg_replace 函数将其替换为 php 写法的字符串。
然后在 config/app.php 文件内加载此 ServiceProvider 文件:
最后需要手动清理已经生成的巨大的 compile 文件:
php artisan clear-compiled
这样就可以在程序里使用自定义的blade扩展标签了。
本文提供了3种方法用于在laravel模板文件内定义全局变量。我们强烈推荐第三种,使用“服务提供者”加载 Blade::extend 的加载规则。这很符合laravel的编程风格。
Happy coding :-)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。
字符串转换为数组
在PHP中,explode() 函数用于将字符串拆分为数组,根据指定的分隔符将字符串分割成多个部分。
下面是 explode() 函数的语法:
array explode ( string $delimiter , string $string [, int $limit=PHP_INT_MAX ] )
参数说明:
$delimiter:指定的分隔符,用于将字符串拆分成多个部分。
$string:要进行拆分的字符串。
$limit(可选):指定返回的数组元素数量的限制。如果设置了该参数,将返回的数组元素数量不超过该限制。如果省略或设置为 PHP_INT_MAX,则不限制返回的数组元素数量。
下面是一个示例,演示了如何使用 explode() 函数将字符串拆分成数组:
$string="apple,banana,orange";
$fruits=explode(",", $string);
print_r($fruits);
输出:
Array
(
[0]=> apple
[1]=> banana
[2]=> orange
)
在上面的示例中,我们使用 , 作为分隔符将字符串 $string 拆分成数组 $fruits。拆分后的数组包含了每个水果作为一个元素。
需要注意的是,explode() 函数是区分大小写的,因此分隔符和目标字符串中的字母大小写必须完全匹配才能正确拆分字符串。
数组转换为字符串
在 PHP 中,join() 和 implode() 函数用于将数组的元素连接成一个字符串。
这两个函数实际上是同一个函数的别名,它们的作用完全相同,只是函数名不同而已。
下面是 implode() / join() 函数的语法:
string implode ( string $glue , array $pieces )
或
string join ( string $glue , array $pieces )
参数说明:
$glue:指定连接数组元素的字符串。
$pieces:要连接的数组。
返回值:
implode() / join() 函数返回一个字符串,其中包含了连接后的数组元素。
下面是一个示例,演示了如何使用 implode() / join() 函数:
$fruits=array("apple", "banana", "orange");
$string=implode(", ", $fruits);
echo $string;
在上面的示例中,我们使用 , 作为连接字符串的分隔符,将数组 $fruits 的元素连接成一个字符串 $string。
需要注意的是,分隔符是可选的,您可以根据需要选择合适的分隔符。如果不指定分隔符,implode() / join() 函数将直接将数组元素连接在一起。
总结来说,implode() 和 join() 是用于将数组元素连接成字符串的函数,它们的作用完全相同,只是函数名不同。您可以根据个人偏好选择使用其中任何一个。
substr
在 PHP 中,substr() 函数用于从字符串中获取指定的子字符串。
下面是 substr() 函数的语法:
string substr ( string $string , int $start [, int $length ] )
参数说明:
$string:要截取的字符串。
$start:指定截取的起始位置。如果为正数,则表示从字符串的左侧开始计数,索引从 0 开始;如果为负数,则表示从字符串的右侧开始计数,索引从 -1 开始。
$length(可选):指定截取的长度。如果省略该参数,则截取从起始位置到字符串末尾的所有字符。
返回值:
substr() 函数返回一个字符串,包含了从原始字符串中截取的子字符串。
下面是一些示例,演示了如何使用 substr() 函数:
$string="Hello, World!";
$substring1=substr($string, 0, 5); // 从索引位置 0 开始,截取 5 个字符
$substring2=substr($string, 7); // 从索引位置 7 开始,截取到末尾的所有字符
$substring3=substr($string, -6); // 从右侧第 6 个字符开始,截取到末尾的所有字符
echo $substring1 . "\n"; // 输出:Hello
echo $substring2 . "\n"; // 输出:World!
echo $substring3 . "\n"; // 输出:World!
在上面的示例中,我们使用 substr() 函数从字符串 $string 中截取了不同的子字符串。可以看到,通过指定起始位置和长度,我们可以灵活地截取字符串的不同部分。
需要注意的是,substr() 函数对于多字节字符(如 UTF-8 编码的字符)可能会出现问题,因为它是按字节长度进行截取的。如果需要处理多字节字符,可以使用 mb_substr() 函数来确保正确处理字符的长度。
strstr
在 PHP 中,strstr() 函数用于在字符串中查找指定的子字符串,并返回从该子字符串开始到字符串末尾的部分。
下面是 strstr() 函数的语法:
string strstr ( string $haystack , mixed $needle [, bool $before_needle=false ] )
参数说明:
$haystack:要搜索的字符串。
$needle:要查找的子字符串。
$before_needle(可选):一个布尔值,用于指定是否返回 $needle 之前的部分。如果设置为 true,则返回 $needle 之前的部分;如果设置为 false(默认值),则返回 $needle 开始到字符串末尾的部分。
返回值:
strstr() 函数返回一个字符串,包含了从 $needle 开始到字符串末尾的部分。如果找不到 $needle,则返回 false。
下面是一些示例,演示了如何使用 strstr() 函数:
$string="Hello, World!";
$substring1=strstr($string, "World"); // 查找 "World" 并返回从它开始到字符串末尾的部分
$substring2=strstr($string, "World", true); // 查找 "World" 并返回它之前的部分
echo $substring1 . "\n"; // 输出:World!
echo $substring2 . "\n"; // 输出:Hello,
在上面的示例中,我们使用 strstr() 函数在字符串 $string 中查找子字符串 "World"。可以看到,通过指定子字符串并选择是否返回之前的部分,我们可以从原始字符串中获取所需的部分。
需要注意的是,strstr() 函数对大小写敏感。如果需要进行大小写不敏感的搜索,可以使用 stristr() 函数。此外,如果需要处理多字节字符(如 UTF-8 编码的字符),可以使用 mb_strstr() 函数来确保正确处理字符的长度。
strops
strpos() 函数用于在字符串中查找指定子字符串的第一次出现,并返回它的位置(索引)。
下面是 strpos() 函数的语法:
int strpos ( string $haystack , mixed $needle [, int $offset=0 ] )
参数说明:
$haystack:要搜索的字符串。
$needle:要查找的子字符串。
$offset(可选):指定搜索的起始位置。如果设置了偏移量,则从该位置开始搜索子字符串。
返回值:
如果找到子字符串,则返回它在 $haystack 中的位置(索引),该位置从 0 开始计数。
如果未找到子字符串,则返回 false。
下面是一个示例,演示了如何使用 strpos() 函数:
$string="Hello, World!";
$position=strpos($string, "World");
echo $position; // 输出:7
在上面的示例中,我们使用 strpos() 函数在字符串 $string 中查找子字符串 "World"。函数返回子字符串的起始位置,即索引值 7。
需要注意的是,strpos() 函数对大小写敏感。如果需要进行大小写不敏感的搜索,可以使用 stripos() 函数。此外,如果需要查找子字符串的最后一次出现位置,可以使用 strrpos() 函数。
str_replace
str_replace() 函数用于在字符串中替换指定的子字符串。
下面是 str_replace() 函数的语法:
mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ]
参数说明:
$search:要搜索并替换的子字符串或子字符串数组。可以是一个字符串或一个字符串数组。
$replace:用于替换匹配子字符串的新字符串或新字符串数组。可以是一个字符串或一个字符串数组。
$subject:要在其中进行替换的原始字符串或原始字符串数组。可以是一个字符串或一个字符串数组。
$count(可选):如果提供了此参数,并且是一个变量,它将接收被替换的次数。
返回值:
如果 $subject 是一个字符串,则返回一个字符串,其中所有匹配的子字符串都被替换为相应的新字符串。
如果 $subject 是一个数组,则返回一个数组,其中所有元素都被替换为相应的新字符串。
下面是一些示例,演示了如何使用 str_replace() 函数:
$string="Hello, World!";
$newString=str_replace("World", "PHP", $string);
echo $newString; // 输出:Hello, PHP!
在上面的示例中,我们使用 str_replace() 函数将字符串 $string 中的子字符串 "World" 替换为 "PHP",并将替换后的结果存储在 $newString 变量中。
str_replace() 函数还可以处理数组。下面是一个数组示例:
$fruits=array("apple", "banana", "orange");
$newFruits=str_replace("banana", "kiwi", $fruits);
print_r($newFruits);
输出:
Array
(
[0]=> apple
[1]=> kiwi
[2]=> orange
)
在上面的示例中,我们使用 str_replace() 函数将数组 $fruits 中的元素 "banana" 替换为 "kiwi",并将替换后的新数组存储在 $newFruits 变量中。
需要注意的是,str_replace() 函数对大小写敏感。如果需要进行大小写不敏感的替换,可以使用 str_ireplace() 函数。
trim
在 PHP 中,trim() 函数用于去除字符串两端的空白字符或指定的字符。
下面是 trim() 函数的语法:
string trim ( string $string [, string $characters=" \t\n\r>string trim ( string $string [, string $characters=" \t\n\r\0\x0B" ] )<\x0B" ] )
参数说明:
$string:要进行修剪的字符串。
$characters(可选):指定要移除的字符。默认情况下,会移除字符串两端的空白字符(包括空格、制表符、换行符、回车符、空字符和垂直制表符)。
返回值:
trim() 函数返回一个修剪后的字符串。
下面是一些示例,演示了如何使用 trim() 函数:
$string=" Hello, World! ";
$trimmedString=trim($string);
echo $trimmedString; // 输出:Hello, World!
在上面的示例中,我们使用 trim() 函数去除字符串 $string 两端的空白字符,得到修剪后的字符串。
您还可以通过指定第二个参数来自定义要移除的字符。例如:
$string="-Hello, World!--";
$trimmedString=trim($string, '-');
echo $trimmedString; // 输出:Hello, World!
在上面的示例中,我们使用 trim() 函数去除字符串 $string 两端的连字符(-),得到修剪后的字符串。
需要注意的是,trim() 函数只移除字符串两端的字符,不会修改字符串中间的字符。如果需要移除字符串中间的特定字符,可以使用其他字符串处理函数(如 str_replace())来实现。
strip_tags
strip_tags() 函数用于从字符串中去除 HTML 和 PHP 标签,只保留纯文本内容。
下面是 strip_tags() 函数的语法:
string strip_tags ( string $str [, string $allowable_tags ] )
参数说明:
$str:要去除标签的字符串。
$allowable_tags(可选):指定允许保留的标签。如果提供此参数,它将指定允许保留的标签列表,其他标签将被完全移除。
返回值:
strip_tags() 函数返回一个去除了标签的字符串。
下面是一个示例,演示了如何使用 strip_tags() 函数:
$string="<p>Hello, <b>World</b>!</p>";
$strippedString=strip_tags($string);
echo $strippedString; // 输出:Hello, World!
在上面的示例中,我们使用 strip_tags() 函数从字符串 $string 中去除 HTML 标签,得到纯文本内容。
您还可以通过提供第二个参数来指定允许保留的标签。例如:
$string="<p>Hello, <b>World</b>! This is a <a href='example.com'>link</a>.</p>";
$allowedTags="<b><a>";
$strippedString=strip_tags($string, $allowedTags);
echo $strippedString; // 输出:Hello, <b>World</b>! This is a <a href='example.com'>link</a>.
在上面的示例中,我们使用 strip_tags() 函数从字符串 $string 中去除除 <b> 和 <a> 标签以外的所有标签,并保留这两个标签。
需要注意的是,strip_tags() 函数只能去除 HTML 和 PHP 标签,不能过滤或处理其他类型的标记语言。如果需要更复杂的标记处理,可以考虑使用专门的 HTML 解析库或过滤器。
获取get请求的参数
$_SERVER 是一个 PHP 超全局变量,用于存储有关服务器和请求的信息。它是一个关联数组,包含了诸如请求头、路径、脚本位置、服务器信息等等的键值对。
$_SERVER['QUERY_STRING']:当前请求的查询字符串部分。
parse_str() 函数用于将查询字符串解析为变量并存储在数组中。
parse_str($_SERVER['QUERY_STRING'], $arr);
这行代码将会解析 $_SERVER['QUERY_STRING'] 中的查询字符串,并将解析后的变量存储在 $arr 数组中。
例如,假设当前请求的 URL 是 example.com/index.php?name=John&age=25,$_SERVER['QUERY_STRING'] 的值为 "name=John&age=25"。使用 parse_str() 函数后,$arr 数组将包含以下内容:
$arr=[
'name'=> 'John',
'age'=> '25'
];
http_build_query
http_build_query() 函数用于将数组转换为 URL 编码的查询字符串。
下面是 http_build_query() 函数的语法:
string http_build_query ( mixed $query_data [, string $numeric_prefix=null [, string $arg_separator='&' [, int $enc_type=PHP_QUERY_RFC1738 ]]] )
参数说明:
$query_data:要转换为查询字符串的数组或对象。
$numeric_prefix(可选):如果数组具有数字索引键,则此参数指定数字索引键的前缀。默认为 null。
$arg_separator(可选):用于分隔查询参数的字符串。默认为 &。
$enc_type(可选):指定编码类型。可选值为 PHP_QUERY_RFC1738(默认)和 PHP_QUERY_RFC3986。
返回值:
http_build_query() 函数返回一个 URL 编码的查询字符串。
下面是一个示例,演示了如何使用 http_build_query() 函数:
$data=array(
'name'=> 'John',
'age'=> 25,
'city'=> 'New York'
);
$queryString=http_build_query($data);
echo $queryString;
// 输出:name=John&age=25&city=New+York
在上面的示例中,我们将数组 $data 转换为 URL 编码的查询字符串。每个数组元素都会转换为一个查询参数,并使用 & 分隔。
parse_url
parse_url() 函数用于解析 URL 并返回其各个组成部分的关联数组。
下面是 parse_url() 函数的语法:
mixed parse_url ( string $url [, int $component=-1 ] )
参数说明:
$url:要解析的 URL 字符串。
$component(可选):指定要返回的组件。默认值为 -1,返回包含所有组件的关联数组。可选值为 PHP_URL_SCHEME、PHP_URL_HOST、PHP_URL_PORT、PHP_URL_USER、PHP_URL_PASS、PHP_URL_PATH、PHP_URL_QUERY、PHP_URL_FRAGMENT,分别代表不同的组件。
返回值:
如果 $component 参数为 -1,则返回一个包含 URL 各个组件的关联数组。如果指定了 $component 参数,则返回对应的组件字符串。
下面是一个示例,演示了如何使用 parse_url() 函数:
$url="https://www.example.com:8080/path/to/page?query=string#fragment";
$urlComponents=parse_url($url);
echo $urlComponents['scheme']; // 输出:https
echo $urlComponents['host']; // 输出:www.example.com
echo $urlComponents['port']; // 输出:8080
echo $urlComponents['path']; // 输出:/path/to/page
echo $urlComponents['query']; // 输出:query=string
echo $urlComponents['fragment']; // 输出:fragment
在上面的示例中,我们使用 parse_url() 函数解析了 URL 字符串 $url,并将各个组件存储在关联数组 $urlComponents 中。然后,我们可以通过访问数组元素来获取特定的组件值。
如果只想获取单个组件的值,可以在调用 parse_url() 函数时指定 $component 参数。例如,如果只想获取主机名,可以这样做:
$url="https://www.example.com/path/to/page";
$host=parse_url($url, PHP_URL_HOST);
echo $host; // 输出:www.example.com
在上面的示例中,我们使用 parse_url($url, PHP_URL_HOST) 仅返回 URL 的主机名。
需要注意的是,parse_url() 函数只能解析标准格式的 URL,例如 http://example.com 或 https://www.example.com。对于非标准格式的 URL,解析结果可能会有所不同。
*请认真填写需求信息,我们会在24小时内与您取得联系。