Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
在官方的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小時內與您取得聯系。