在官方的PHP實(shí)現(xiàn)內(nèi)部,所有變量使用同一種數(shù)據(jù)結(jié)構(gòu)(zval)來保存,而這個結(jié)構(gòu)同時表示PHP中的各種數(shù)據(jù)類型。 它不僅僅包含變量的值,也包含變量的類型。這就是PHP弱類型的核心。
標(biāo)量類型: boolean、integer、float(double)、string
復(fù)合類型: array、object
特殊類型: resource、NULL
變量的存儲結(jié)構(gòu)
PHP在內(nèi)核中是通過zval這個結(jié)構(gòu)體來存儲變量的,它的定義在Zend/zend.h文件里,簡短精煉,只有四個成員組成:
struct _zval_struct { zvalue_value value; /* 變量的值 */ zend_uint refcount__gc; zend_uchar type; /* 變量當(dāng)前的數(shù)據(jù)類型 */ 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表示引用計數(shù)1
is_ref__gc表示是否為引用0
value存儲變量的值
type變量具體的類型
變量的類型
zval結(jié)構(gòu)體的type字段就是實(shí)現(xiàn)弱類型最關(guān)鍵的字段,type的值可以為: IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_ARRAY、IS_OBJECT、IS_RESOURCE。 從字面上就很好理解,他們只是類型的唯一標(biāo)示,根據(jù)類型的不同將不同的值存儲到value字段。 除此之外,和他們定義在一起的類型還有IS_CONSTANT和IS_CONSTANT_ARRAY。
示例
<?php $foo='bar'; ?>
上面是一段PHP語言的例子,創(chuàng)建一個變量,并把它的值設(shè)置為’bar’,步驟: 創(chuàng)建一個zval結(jié)構(gòu),并設(shè)置其類型。 設(shè)置值為’bar’。 將其加入當(dāng)前作用域的符號表,這樣用戶才能在PHP里使用這個變量 具體的代碼為:
{ zval *fooval; MAKE_STD_ZVAL(fooval); ZVAL_STRING(fooval, "bar", 1); ZEND_SET_SYMBOL( EG(active_symbol_table) , "foo" , fooval); }
首先,我們聲明一個zval指針,并申請一塊內(nèi)存。然后通過ZVAL_STRING宏將值設(shè)置為
<?php $foo='bar'; ?>,最后一行的作用就是將這個zval加入到當(dāng)前的符號表里去,并將其label定義成foo,這樣用戶就可以在代碼里通過$foo來使用它。
備注
建議好好看看參考2的鏈接,里面講了很多關(guān)于變量的知識。
參考
http://www.laruence.com/2008/08/12/180.html
https://www.kancloud.cn/nickbai/php7/363267
Laravel秉持MVC的設(shè)計理念,在V=view 中放置視圖相關(guān)的內(nèi)容。特別是 blade 模板引擎帶來了很強(qiáng)大的解析方式。
與傳統(tǒng)的PHP與HTML寫作一團(tuán)方式不容,Blade 使用特定的語法結(jié)構(gòu),將變量數(shù)據(jù)渲染到視圖內(nèi)。
那么如何優(yōu)雅地在視圖文件里定義一個PHP變量呢?
比如聲明一個變量,你完全可以混雜PHP標(biāo)簽的內(nèi)容:
<?php $old_section="whatever"; ?>
這非常不優(yōu)雅,不是嗎?但是,像下面這樣:
{{ $old_section="whatever" }}
會直接輸出變量值。這不是想要的結(jié)果。在laravel blade 模板里,你應(yīng)該使用下面的標(biāo)簽
@php
$i=1
@endphp
這樣把PHP書寫的內(nèi)容,使用特定的標(biāo)識符隔開,就達(dá)到目的了。當(dāng)然你還可以使用簡寫:
@php ($i=1)
這與上方的結(jié)構(gòu)塊寫法輸出結(jié)果相同。
換一種思路,如果版本較早,不能支持php結(jié)構(gòu)塊,我們可以使用 if 語句塊實(shí)現(xiàn),在條件語句內(nèi)使用賦值寫法。如下:
@if ($variable='any data, be it string, variable or OOP') @endif
注意在判斷語句內(nèi),使用了賦值語句,那么變量 $variable 就被聲明且可外部訪問了。
這也是曲線救國的一種方式吧。
laravel系統(tǒng)提供了模板的擴(kuò)展使用系統(tǒng)不具備的標(biāo)簽。我們使用 ServiceProvider 注冊一個先的 BaldeServiceProvider,在其中添加 Blade 模板的擴(kuò)展方法。
首先創(chuàng)建文件
app/Providers/BladeServiceProvider.php
然后添加下面的代碼:
我們使用自定義的標(biāo)簽 define 用于聲明變量,使用 preg_replace 函數(shù)將其替換為 php 寫法的字符串。
然后在 config/app.php 文件內(nèi)加載此 ServiceProvider 文件:
最后需要手動清理已經(jīng)生成的巨大的 compile 文件:
php artisan clear-compiled
這樣就可以在程序里使用自定義的blade擴(kuò)展標(biāo)簽了。
本文提供了3種方法用于在laravel模板文件內(nèi)定義全局變量。我們強(qiáng)烈推薦第三種,使用“服務(wù)提供者”加載 Blade::extend 的加載規(guī)則。這很符合laravel的編程風(fēng)格。
Happy coding :-)
我是 @程序員小助手 ,持續(xù)分享編程知識,歡迎關(guān)注。
字符串轉(zhuǎn)換為數(shù)組
在PHP中,explode() 函數(shù)用于將字符串拆分為數(shù)組,根據(jù)指定的分隔符將字符串分割成多個部分。
下面是 explode() 函數(shù)的語法:
array explode ( string $delimiter , string $string [, int $limit=PHP_INT_MAX ] )
參數(shù)說明:
$delimiter:指定的分隔符,用于將字符串拆分成多個部分。
$string:要進(jìn)行拆分的字符串。
$limit(可選):指定返回的數(shù)組元素數(shù)量的限制。如果設(shè)置了該參數(shù),將返回的數(shù)組元素數(shù)量不超過該限制。如果省略或設(shè)置為 PHP_INT_MAX,則不限制返回的數(shù)組元素數(shù)量。
下面是一個示例,演示了如何使用 explode() 函數(shù)將字符串拆分成數(shù)組:
$string="apple,banana,orange";
$fruits=explode(",", $string);
print_r($fruits);
輸出:
Array
(
[0]=> apple
[1]=> banana
[2]=> orange
)
在上面的示例中,我們使用 , 作為分隔符將字符串 $string 拆分成數(shù)組 $fruits。拆分后的數(shù)組包含了每個水果作為一個元素。
需要注意的是,explode() 函數(shù)是區(qū)分大小寫的,因此分隔符和目標(biāo)字符串中的字母大小寫必須完全匹配才能正確拆分字符串。
數(shù)組轉(zhuǎn)換為字符串
在 PHP 中,join() 和 implode() 函數(shù)用于將數(shù)組的元素連接成一個字符串。
這兩個函數(shù)實(shí)際上是同一個函數(shù)的別名,它們的作用完全相同,只是函數(shù)名不同而已。
下面是 implode() / join() 函數(shù)的語法:
string implode ( string $glue , array $pieces )
或
string join ( string $glue , array $pieces )
參數(shù)說明:
$glue:指定連接數(shù)組元素的字符串。
$pieces:要連接的數(shù)組。
返回值:
implode() / join() 函數(shù)返回一個字符串,其中包含了連接后的數(shù)組元素。
下面是一個示例,演示了如何使用 implode() / join() 函數(shù):
$fruits=array("apple", "banana", "orange");
$string=implode(", ", $fruits);
echo $string;
在上面的示例中,我們使用 , 作為連接字符串的分隔符,將數(shù)組 $fruits 的元素連接成一個字符串 $string。
需要注意的是,分隔符是可選的,您可以根據(jù)需要選擇合適的分隔符。如果不指定分隔符,implode() / join() 函數(shù)將直接將數(shù)組元素連接在一起。
總結(jié)來說,implode() 和 join() 是用于將數(shù)組元素連接成字符串的函數(shù),它們的作用完全相同,只是函數(shù)名不同。您可以根據(jù)個人偏好選擇使用其中任何一個。
substr
在 PHP 中,substr() 函數(shù)用于從字符串中獲取指定的子字符串。
下面是 substr() 函數(shù)的語法:
string substr ( string $string , int $start [, int $length ] )
參數(shù)說明:
$string:要截取的字符串。
$start:指定截取的起始位置。如果為正數(shù),則表示從字符串的左側(cè)開始計數(shù),索引從 0 開始;如果為負(fù)數(shù),則表示從字符串的右側(cè)開始計數(shù),索引從 -1 開始。
$length(可選):指定截取的長度。如果省略該參數(shù),則截取從起始位置到字符串末尾的所有字符。
返回值:
substr() 函數(shù)返回一個字符串,包含了從原始字符串中截取的子字符串。
下面是一些示例,演示了如何使用 substr() 函數(shù):
$string="Hello, World!";
$substring1=substr($string, 0, 5); // 從索引位置 0 開始,截取 5 個字符
$substring2=substr($string, 7); // 從索引位置 7 開始,截取到末尾的所有字符
$substring3=substr($string, -6); // 從右側(cè)第 6 個字符開始,截取到末尾的所有字符
echo $substring1 . "\n"; // 輸出:Hello
echo $substring2 . "\n"; // 輸出:World!
echo $substring3 . "\n"; // 輸出:World!
在上面的示例中,我們使用 substr() 函數(shù)從字符串 $string 中截取了不同的子字符串??梢钥吹剑ㄟ^指定起始位置和長度,我們可以靈活地截取字符串的不同部分。
需要注意的是,substr() 函數(shù)對于多字節(jié)字符(如 UTF-8 編碼的字符)可能會出現(xiàn)問題,因?yàn)樗前醋止?jié)長度進(jìn)行截取的。如果需要處理多字節(jié)字符,可以使用 mb_substr() 函數(shù)來確保正確處理字符的長度。
strstr
在 PHP 中,strstr() 函數(shù)用于在字符串中查找指定的子字符串,并返回從該子字符串開始到字符串末尾的部分。
下面是 strstr() 函數(shù)的語法:
string strstr ( string $haystack , mixed $needle [, bool $before_needle=false ] )
參數(shù)說明:
$haystack:要搜索的字符串。
$needle:要查找的子字符串。
$before_needle(可選):一個布爾值,用于指定是否返回 $needle 之前的部分。如果設(shè)置為 true,則返回 $needle 之前的部分;如果設(shè)置為 false(默認(rèn)值),則返回 $needle 開始到字符串末尾的部分。
返回值:
strstr() 函數(shù)返回一個字符串,包含了從 $needle 開始到字符串末尾的部分。如果找不到 $needle,則返回 false。
下面是一些示例,演示了如何使用 strstr() 函數(shù):
$string="Hello, World!";
$substring1=strstr($string, "World"); // 查找 "World" 并返回從它開始到字符串末尾的部分
$substring2=strstr($string, "World", true); // 查找 "World" 并返回它之前的部分
echo $substring1 . "\n"; // 輸出:World!
echo $substring2 . "\n"; // 輸出:Hello,
在上面的示例中,我們使用 strstr() 函數(shù)在字符串 $string 中查找子字符串 "World"??梢钥吹?,通過指定子字符串并選擇是否返回之前的部分,我們可以從原始字符串中獲取所需的部分。
需要注意的是,strstr() 函數(shù)對大小寫敏感。如果需要進(jìn)行大小寫不敏感的搜索,可以使用 stristr() 函數(shù)。此外,如果需要處理多字節(jié)字符(如 UTF-8 編碼的字符),可以使用 mb_strstr() 函數(shù)來確保正確處理字符的長度。
strops
strpos() 函數(shù)用于在字符串中查找指定子字符串的第一次出現(xiàn),并返回它的位置(索引)。
下面是 strpos() 函數(shù)的語法:
int strpos ( string $haystack , mixed $needle [, int $offset=0 ] )
參數(shù)說明:
$haystack:要搜索的字符串。
$needle:要查找的子字符串。
$offset(可選):指定搜索的起始位置。如果設(shè)置了偏移量,則從該位置開始搜索子字符串。
返回值:
如果找到子字符串,則返回它在 $haystack 中的位置(索引),該位置從 0 開始計數(shù)。
如果未找到子字符串,則返回 false。
下面是一個示例,演示了如何使用 strpos() 函數(shù):
$string="Hello, World!";
$position=strpos($string, "World");
echo $position; // 輸出:7
在上面的示例中,我們使用 strpos() 函數(shù)在字符串 $string 中查找子字符串 "World"。函數(shù)返回子字符串的起始位置,即索引值 7。
需要注意的是,strpos() 函數(shù)對大小寫敏感。如果需要進(jìn)行大小寫不敏感的搜索,可以使用 stripos() 函數(shù)。此外,如果需要查找子字符串的最后一次出現(xiàn)位置,可以使用 strrpos() 函數(shù)。
str_replace
str_replace() 函數(shù)用于在字符串中替換指定的子字符串。
下面是 str_replace() 函數(shù)的語法:
mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ]
參數(shù)說明:
$search:要搜索并替換的子字符串或子字符串?dāng)?shù)組。可以是一個字符串或一個字符串?dāng)?shù)組。
$replace:用于替換匹配子字符串的新字符串或新字符串?dāng)?shù)組??梢允且粋€字符串或一個字符串?dāng)?shù)組。
$subject:要在其中進(jìn)行替換的原始字符串或原始字符串?dāng)?shù)組??梢允且粋€字符串或一個字符串?dāng)?shù)組。
$count(可選):如果提供了此參數(shù),并且是一個變量,它將接收被替換的次數(shù)。
返回值:
如果 $subject 是一個字符串,則返回一個字符串,其中所有匹配的子字符串都被替換為相應(yīng)的新字符串。
如果 $subject 是一個數(shù)組,則返回一個數(shù)組,其中所有元素都被替換為相應(yīng)的新字符串。
下面是一些示例,演示了如何使用 str_replace() 函數(shù):
$string="Hello, World!";
$newString=str_replace("World", "PHP", $string);
echo $newString; // 輸出:Hello, PHP!
在上面的示例中,我們使用 str_replace() 函數(shù)將字符串 $string 中的子字符串 "World" 替換為 "PHP",并將替換后的結(jié)果存儲在 $newString 變量中。
str_replace() 函數(shù)還可以處理數(shù)組。下面是一個數(shù)組示例:
$fruits=array("apple", "banana", "orange");
$newFruits=str_replace("banana", "kiwi", $fruits);
print_r($newFruits);
輸出:
Array
(
[0]=> apple
[1]=> kiwi
[2]=> orange
)
在上面的示例中,我們使用 str_replace() 函數(shù)將數(shù)組 $fruits 中的元素 "banana" 替換為 "kiwi",并將替換后的新數(shù)組存儲在 $newFruits 變量中。
需要注意的是,str_replace() 函數(shù)對大小寫敏感。如果需要進(jìn)行大小寫不敏感的替換,可以使用 str_ireplace() 函數(shù)。
trim
在 PHP 中,trim() 函數(shù)用于去除字符串兩端的空白字符或指定的字符。
下面是 trim() 函數(shù)的語法:
string trim ( string $string [, string $characters=" \t\n\r>string trim ( string $string [, string $characters=" \t\n\r\0\x0B" ] )<\x0B" ] )
參數(shù)說明:
$string:要進(jìn)行修剪的字符串。
$characters(可選):指定要移除的字符。默認(rèn)情況下,會移除字符串兩端的空白字符(包括空格、制表符、換行符、回車符、空字符和垂直制表符)。
返回值:
trim() 函數(shù)返回一個修剪后的字符串。
下面是一些示例,演示了如何使用 trim() 函數(shù):
$string=" Hello, World! ";
$trimmedString=trim($string);
echo $trimmedString; // 輸出:Hello, World!
在上面的示例中,我們使用 trim() 函數(shù)去除字符串 $string 兩端的空白字符,得到修剪后的字符串。
您還可以通過指定第二個參數(shù)來自定義要移除的字符。例如:
$string="-Hello, World!--";
$trimmedString=trim($string, '-');
echo $trimmedString; // 輸出:Hello, World!
在上面的示例中,我們使用 trim() 函數(shù)去除字符串 $string 兩端的連字符(-),得到修剪后的字符串。
需要注意的是,trim() 函數(shù)只移除字符串兩端的字符,不會修改字符串中間的字符。如果需要移除字符串中間的特定字符,可以使用其他字符串處理函數(shù)(如 str_replace())來實(shí)現(xiàn)。
strip_tags
strip_tags() 函數(shù)用于從字符串中去除 HTML 和 PHP 標(biāo)簽,只保留純文本內(nèi)容。
下面是 strip_tags() 函數(shù)的語法:
string strip_tags ( string $str [, string $allowable_tags ] )
參數(shù)說明:
$str:要去除標(biāo)簽的字符串。
$allowable_tags(可選):指定允許保留的標(biāo)簽。如果提供此參數(shù),它將指定允許保留的標(biāo)簽列表,其他標(biāo)簽將被完全移除。
返回值:
strip_tags() 函數(shù)返回一個去除了標(biāo)簽的字符串。
下面是一個示例,演示了如何使用 strip_tags() 函數(shù):
$string="<p>Hello, <b>World</b>!</p>";
$strippedString=strip_tags($string);
echo $strippedString; // 輸出:Hello, World!
在上面的示例中,我們使用 strip_tags() 函數(shù)從字符串 $string 中去除 HTML 標(biāo)簽,得到純文本內(nèi)容。
您還可以通過提供第二個參數(shù)來指定允許保留的標(biāo)簽。例如:
$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() 函數(shù)從字符串 $string 中去除除 <b> 和 <a> 標(biāo)簽以外的所有標(biāo)簽,并保留這兩個標(biāo)簽。
需要注意的是,strip_tags() 函數(shù)只能去除 HTML 和 PHP 標(biāo)簽,不能過濾或處理其他類型的標(biāo)記語言。如果需要更復(fù)雜的標(biāo)記處理,可以考慮使用專門的 HTML 解析庫或過濾器。
獲取get請求的參數(shù)
$_SERVER 是一個 PHP 超全局變量,用于存儲有關(guān)服務(wù)器和請求的信息。它是一個關(guān)聯(lián)數(shù)組,包含了諸如請求頭、路徑、腳本位置、服務(wù)器信息等等的鍵值對。
$_SERVER['QUERY_STRING']:當(dāng)前請求的查詢字符串部分。
parse_str() 函數(shù)用于將查詢字符串解析為變量并存儲在數(shù)組中。
parse_str($_SERVER['QUERY_STRING'], $arr);
這行代碼將會解析 $_SERVER['QUERY_STRING'] 中的查詢字符串,并將解析后的變量存儲在 $arr 數(shù)組中。
例如,假設(shè)當(dāng)前請求的 URL 是 example.com/index.php?name=John&age=25,$_SERVER['QUERY_STRING'] 的值為 "name=John&age=25"。使用 parse_str() 函數(shù)后,$arr 數(shù)組將包含以下內(nèi)容:
$arr=[
'name'=> 'John',
'age'=> '25'
];
http_build_query
http_build_query() 函數(shù)用于將數(shù)組轉(zhuǎn)換為 URL 編碼的查詢字符串。
下面是 http_build_query() 函數(shù)的語法:
string http_build_query ( mixed $query_data [, string $numeric_prefix=null [, string $arg_separator='&' [, int $enc_type=PHP_QUERY_RFC1738 ]]] )
參數(shù)說明:
$query_data:要轉(zhuǎn)換為查詢字符串的數(shù)組或?qū)ο蟆?/p>
$numeric_prefix(可選):如果數(shù)組具有數(shù)字索引鍵,則此參數(shù)指定數(shù)字索引鍵的前綴。默認(rèn)為 null。
$arg_separator(可選):用于分隔查詢參數(shù)的字符串。默認(rèn)為 &。
$enc_type(可選):指定編碼類型。可選值為 PHP_QUERY_RFC1738(默認(rèn))和 PHP_QUERY_RFC3986。
返回值:
http_build_query() 函數(shù)返回一個 URL 編碼的查詢字符串。
下面是一個示例,演示了如何使用 http_build_query() 函數(shù):
$data=array(
'name'=> 'John',
'age'=> 25,
'city'=> 'New York'
);
$queryString=http_build_query($data);
echo $queryString;
// 輸出:name=John&age=25&city=New+York
在上面的示例中,我們將數(shù)組 $data 轉(zhuǎn)換為 URL 編碼的查詢字符串。每個數(shù)組元素都會轉(zhuǎn)換為一個查詢參數(shù),并使用 & 分隔。
parse_url
parse_url() 函數(shù)用于解析 URL 并返回其各個組成部分的關(guān)聯(lián)數(shù)組。
下面是 parse_url() 函數(shù)的語法:
mixed parse_url ( string $url [, int $component=-1 ] )
參數(shù)說明:
$url:要解析的 URL 字符串。
$component(可選):指定要返回的組件。默認(rèn)值為 -1,返回包含所有組件的關(guān)聯(lián)數(shù)組??蛇x值為 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 參數(shù)為 -1,則返回一個包含 URL 各個組件的關(guān)聯(lián)數(shù)組。如果指定了 $component 參數(shù),則返回對應(yīng)的組件字符串。
下面是一個示例,演示了如何使用 parse_url() 函數(shù):
$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() 函數(shù)解析了 URL 字符串 $url,并將各個組件存儲在關(guān)聯(lián)數(shù)組 $urlComponents 中。然后,我們可以通過訪問數(shù)組元素來獲取特定的組件值。
如果只想獲取單個組件的值,可以在調(diào)用 parse_url() 函數(shù)時指定 $component 參數(shù)。例如,如果只想獲取主機(jī)名,可以這樣做:
$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 的主機(jī)名。
需要注意的是,parse_url() 函數(shù)只能解析標(biāo)準(zhǔn)格式的 URL,例如 http://example.com 或 https://www.example.com。對于非標(biāo)準(zhǔn)格式的 URL,解析結(jié)果可能會有所不同。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。