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
ordPress 的 PHP 編碼標準對整個 WordPress 社區都適用,但是對于 WordPress 核心代碼是強制要求的,而對于主題和插件,WordPress 則鼓勵使用,因為主題和插件的作者可能會選擇遵循別的編碼風格。
但這個編碼規范不僅關于編碼風格,還包括 WordPress 生態中互操作性、可翻譯性和安全性等方面的最佳實踐,因此即使使用其他的編碼風格 ,還是建議開發者在最佳實踐方面仍然遵守 WordPress 編碼標準。
目前也不是所有的核心代碼都完全符合這個規范,但所有新提交和/或更新的代碼則都要求完全遵守。
對于開發者來說,如果想根據這個規范去自動檢查自己的代碼,可以使用基于 PHP_CodeSniffer 開發的官方 WordPress 編碼規范工具。
正確的使用單引號和雙引號,如果字符串中不包含變量的時候,則使用單引號,永遠不要在字符串中轉移引號,而是通過切換引號類型,比如:
echo '<a href="/static/link" title="Yeah yeah!">Link name</a>';
echo "<a href='$link' title='$linktitle'>$linkname</a>";
HTML 或 XML 屬性中的文本應該進行轉義,以便單引號或者雙引號不會結束屬性使得 HTML 標簽無效,甚至引起安全問題,如何對屬性進行轉義,我們會在以后的文章中詳細講解。
首先使用制表符而不是空格進行縮進,并且使用空格把代碼對齊,以便更易閱讀:
[tab]$foo = 'somevalue';
[tab]$foo2 = 'somevalue2';
[tab]$foo34 = 'somevalue3';
[tab]$foo5 = 'somevalue4';
對于關聯數組,如果數據含有多個元素的時候,每個元素都應該新起一行:
$query = new WP_Query( array( 'ID' => 123 ) );
$args = array(
[tab]'post_type' => 'page',
[tab]'post_author' => 123,
[tab]'post_status' => 'publish',
);
$query = new WP_Query( $args );
特別關注一下數組最后一個元素后面的逗號,推薦都加上,因為這樣更容易調整數組的順序,并且更容易添加新的元素,因為不用關注之前最后一個是否有逗號。
對于 switch 結構, case 語句應該比 switch 語句多縮進一個制表符, case 的內容也要比 case 條件語句縮進一個 tab。
switch ( $type ) {
[tab]case 'foo':
[tab][tab]some_function();
[tab][tab]break;
[tab]case 'bar':
[tab][tab]some_function();
[tab][tab]break;
}
經驗法則:行首縮進使用制表符,行中對齊使用空格。
大括號的使用樣式如下所示:
if ( condition ) {
action1();
action2();
} elseif ( condition2 && condition3 ) {
action3();
action4();
} else {
defaultaction();
}
如果代碼塊非常長,那就要考慮將其分解成更多的較短的代碼塊,函數或者方法,以便降低復雜度,提高測試的便利性,當然也增加了代碼的可讀性。
不管是否必需,都要使用大括號:
if ( condition ) {
action0();
}
if ( condition ) {
action1();
} elseif ( condition2 ) {
action2a();
action2b();
}
foreach ( $items as $item ) {
process_item( $item );
}
特別注意,強制使用大括號意味著禁止單語句內聯控制結構,但是可以使用控制結構的替代語法(例如 if/endif, while/endwhile)——尤其是在 HTML 的模板中嵌入 PHP 代碼的時候 ,例如:
<?php if ( have_posts() ) : ?>
<div class="hfeed">
<?php while ( have_posts() ) : the_post(); ?>
<article id="post-<?php the_ID() ?>" class="<?php post_class() ?>">
<!-- ... -->
</article>
<?php endwhile; ?>
</div>
<?php endif; ?>
因為 else if 和 if|elseif 代碼塊的冒號語法不兼容,因此條件語句中使用 elseif。
使用長數組語法 ( array( 1, 2, 3 ) ) 聲明數組通常比短數組語法 ( [ 1, 2, 3 ] ) 更具有可讀性,對于初學者,也更有描述性。
所以數組聲明必須使用長數組語法。
在一些的情況下(比如回調函數只需要用一次),可以使用閉包而非重寫一個新函數來作為回調函數傳遞,比如:
$caption = preg_replace_callback(
'/<[a-zA-Z0-9]+(?: [^<>]+>)*/',
function ( $matches ) {
return preg_replace( '/[\r\n\t]+/', ' ', $matches[0] );
},
$caption
);
但是不建議 filter 或 action 的回調函數使用閉包,因為通過 remove_action() / remove_filter() 移除的時候,就變得復雜了。
將一個函數調用拆分為多行時,每個參數必須位于單獨的行上, 單行內聯注釋可以單獨一行:
每個參數不得超過一行,如果一個參數需要多行,那么可以先將其賦值給一個變量,然后再將該變量傳遞給函數調用。
$bar = array(
'use_this' => true,
'meta_key' => 'field_name',
);
$baz = sprintf(
/* translators: %s: Friend's name */
esc_html__( 'Hello, %s!', 'yourtextdomain' ),
$friend_name
);
$a = foo(
$bar,
$baz,
/* translators: %s: cat */
sprintf( __( 'The best pet is a %s.' ), 'cat' )
);
正則表達式應該使用 Perl 兼容的正則表達式(PCRE, preg_函數),另外永遠不要使用 /e 開關,而是使用 preg_replace_callback。
在正則表達式中使用單引號字符串是最簡便的,因為相比雙引號,單引號字符串只有兩個元序列需要轉移:\' 和 \。
在 HTML 模板中如果要嵌入多行 PHP 代碼時,PHP 開始和結束標記都要自己單獨一行。
正確(多行):
function foo() {
?>
<div>
<?php
echo bar(
$baz,
$bat
);
?>
</div>
<?php
}
正確(單行):
<input name="<?php echo esc_attr( $name ); ?>" />
錯誤:
if ( $a === $b ) { ?><some html><?php }
重要:永遠不要使用簡寫的 PHP 標記,使用完整版。
正確:
<?php ... ?>
<?php echo $var; ?>
錯誤:
<? ... ?>
<?= $var ?>
刪除每行末尾的空格,最好在文件末尾省略 PHP 結束標記,如果沒有省略,那就確保刪除 PHP 結束標記后面的空格。
始終在逗號后放置空格,并在邏輯運算符、比較運算符、字符串連接符和賦值運算符的兩側放置空格。
x === 23
foo && bar
! foo
array( 1, 2, 3 )
$baz . '-5'
$term .= 'X'
在控制語句中的左括號和右括號的兩側放置空格:
foreach ( $foo as $bar ) { ...
定義函數時,這樣使用空格:
function my_function( $param1 = 'foo', $param2 = 'bar' ) { ...
function my_other_function() { ...
調用函數時:
my_function( $param1, func_param( $param2 ) );
my_other_function();
當執行邏輯運算時:
if ( ! $foo ) { ...
類型轉換必須使用小寫的, 并且使用簡短形式,(int) 而不是 (integer) ,(bool) 而不是 (boolean),對于浮點類型轉換,請使用 (float) 而不是 (real),因為 (real) 在 PHP 7.4 已被棄用,并在 PHP 8 被移除。
foreach ( (array) $foo as $bar ) { ...
$foo = (bool) $bar;
當涉及到數組元素的時候,僅當元素的索引是變量的時候,在索引周圍包含空格,例如:
$x = $foo['bar']; // 正確
$x = $foo[ 'bar' ]; // 錯誤
$x = $foo[0]; // 正確
$x = $foo[ 0 ]; // 錯誤
$x = $foo[ $bar ]; // 正確
$x = $foo[$bar]; // 錯誤
在 switch 代碼中, case 提交和冒號之間不要有空格:
switch ( $foo ) {
case 'bar': // 正確
case 'ba' : // 錯誤
}
同樣,返回的類型聲明的冒號前不應有空格:
function sum( $a, $b ): float {
return $a + $b;
}
除非另有說明,括號內應有空格。
if ( $foo && ( $bar || $baz ) ) { ...
my_function( ( $x - 1 ) * 5, $y );
在格式化 SQL 語句時,如果 SQL 很復雜,可以將 SQL 語句分成幾行并縮進。當然大部分 SQL 語句一行就可以了。然后將 SQL 語句中的關鍵字(比如 UPDATE 或者 WHERE)大寫。
需要更新數據庫的函數的參數,傳遞來之前應該沒有對數據進行 SQL 斜杠轉義,轉義應該盡可能接近查詢的時候執行,并且最好使用 $wpdb->prepare() 進行。
$wpdb->prepare() 是一種處理 SQL 查詢的轉義、引用和整數轉換的方法。它使用 sprintf() 格式的子集。例子 :
$wpdb->prepare() 是用來對 SQL 查詢進行轉義、引用和整數轉換等操作的方法,它 sprintf() 的一部分格式化方法,比如:
$var = "dangerous'"; // 可能未轉義的原始數據
$id = some_foo_number(); // 期待是整形的數據,但是不能確定
$wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_title = %s WHERE ID = %d", $var, $id ) );
%s 用于字符串占位符,而 %d 用于整數占位符。注意他們沒有被引用,$wpdb->prepare() 會執行轉義和引用的工作。
避免直接操作數據庫,如果有定義的函數可以獲取你需要的數據,則使用它。數據庫抽象(使用函數而不是查詢)有助于保持代碼向前兼容,并且在查詢結果被緩存到內存中的時候,它可以快很多倍。
在變量名,action/filter 的名稱和函數名使用小寫,不要使用駝峰式,通過下劃線分割單詞, 如非必需不要使用縮寫,讓代碼無歧義并能自我說明:
function some_name( $some_variable ) { [...] }
類名必須首字母大寫,并用下劃線分割,首字母縮寫詞都應全部大寫:
class Walker_Category extends Walker { [...] }
class WP_HTTP { [...] }
常量必須全部大寫,并用下劃線分割
define( 'DOING_AJAX', true );
文件名應使用小寫字母進行描述性命名,使用連字符應分隔:
my-plugin-name.php
類文件名應該基于類名,然后在前面加上 class-,然后類名中的下劃線替換為連字符,例如 WP_Error 的文件名:
class-wp-error.php
在 wp-includes 目錄中含有函數模板標簽函數的文件,都會在文件名稱末尾附加 -template 以便它們顯而易見。
general-template.php
比如,有個名為 class-example-class.php 的文件,它只包含一個類:
// 錯誤: 文件 class-example-class.php
class Example_Class { [...] }
class Example_Class_Extended { [...] }
第二個類應該在自己的名字為 class-example-class-extended.php 的文件中:
// 正確:文件 class-example-class-extended.php.
class Example_Class_Extended { [...] }
// 正確:文件 class-example-class-extended.php.
class Example_Class_Extended { [...] }
調用函數時使用字符串值而不是 true 和 false:
// 錯誤
function eat( $what, $slowly = true ) {
...
}
eat( 'mushrooms' );
eat( 'mushrooms', true ); // true 是什么意思呢?
eat( 'dogfood', false ); // false 又是什么意思呢?false 的反面?
PHP 直到 8.0 起,才支持命名參數,但是,由于 WordPress 目前仍支持較舊的 PHP 版本,我們還不能使用這些版本。
沒有命名參數,標志的值是沒有意義的,每次遇到像上面例子這樣的函數調用時,我們都必須搜索函數定義才明白什么意思。通過使用描述性字符串值而不是布爾值,可以使代碼更具可讀性。
// 正確
function eat( $what, $speed = 'slowly' ) {
...
}
eat( 'mushrooms' );
eat( 'mushrooms', 'slowly' );
eat( 'dogfood', 'quickly' );
當需要使用更多詞匯來描述函數參數時,$args 數組參數可能是更好的模式:
// 更好
function eat( $what, $args ) {
...
}
eat ( 'noodles', array( 'speed' => 'moderate' ) );
出于可讀性和可發現性的目的,應使用插值而不是串聯來命名動態 Hook。
動態 Hook 是在其標簽名中包含動態值的 Hook,例如 {$new_status}_{$post->post_type}(publish_post)。
HooK 標簽中使用的變量應該用大括號 { 和 } 括起來,完整的外部標簽名稱用雙引號括起來。這是為了確保 PHP 可以正確解析內插字符串中給定的變量。
do_action( "{$new_status}_{$post->post_type}", $post->ID, $post );
可能的話,標簽名稱中的動態值也應盡可能簡潔明了,比如 $user_id 就比 $this->id 更加清晰明了。
使用三元運算符很好,但是盡量讓他們先測試為真,而不是假,否則容易混淆(一個例外是使用 ! empty(), 因為這里為假反而更直觀)。
// (if statement is true) ? (do this) : (else, do this);
$musictype = ( 'jazz' === $music ) ? 'cool' : 'blah';
// (if field is not empty ) ? (do this) : (else, do this);
if ( true === $the_force ) {
$victorious = you_will( $be );
}
在涉及變量的邏輯比較時,始終將變量放在右側,將常量、文字或函數調用放在左側。如果雙方都不是變量,則順序并不重要。(在計算機科學術語中,在比較中總是嘗試將 l 值放在右側,將 r 值放在左側。)
在上面的例子中,如果省略了一個等號(承認吧,即使是我們當中最有經驗的人也會犯這種錯誤),你會得到一個解析錯誤,因為你不能賦值給一個像 true 這樣的常量,如果該語句是相反的( $the_force = true ),則賦值將完全有效,返回 1,導致 if 語句結果為 true,這種錯誤可能讓你花費很長時間去 Debug。
尤達表達式適用于 ==, !=, ===, 和 !==。而 <, >, <= 或者 >= 情況不會出現賦值的可能,并且不易閱讀,不建議使用。
一般來說,代碼的可讀性比聰明和簡潔更重要:
isset( $var) || $var= some_function();
雖然上面的代碼很巧妙,但如果你不熟悉它,需要一段時間才能理解。所以還是這樣寫吧:
if ( ! isset( $var ) ) {
$var = some_function();
}
除非絕對的必要,否則不應使用松散的比較,因為可能會產生誤導。
正確:
if ( 0 === strpos( 'WordPress', 'foo' ) ) {
echo __( 'Yay WordPress!' );
}
錯誤:
if ( 0 == strpos( 'WordPress', 'foo' ) ) {
echo __( 'Yay WordPress!' );}
賦值最好不要在條件表達式中:
正確:
$data = $wpdb->get_var( '...' );
if ( $data ) {
// Use $data
}
錯誤:
if ( $data = $wpdb->get_var( '...' ) ) {
// Use $data
}
在 switch 語句中,可以將多個空的 case 放到一起。但是,如果一個 case 包含代碼,然后直接進入下一個代碼塊,則必須明確注釋。
switch ( $foo ) {
case 'bar': // 正確,空的 case 無需注釋
case 'baz':
echo $foo; // 錯誤, 含有代碼的 case 必須 break,return 或者含有注釋
case 'cat':
echo 'mouse';
break; // 正確,有 break 的 case 無需注釋
case 'dog':
echo 'horse';
// no break // 正確,含有注釋的 case 可以不要 break。
case 'fish':
echo 'bird';
break;
}
goto 語句絕對不能用。
eval() 是非常危險并且無法確保安全。 create_function() 函數,相當于內部執行了內部執行 eval(),PHP 7.2 起已棄用,并已在 PHP 8.0 中刪除,所以都不能使用。
引用 PHP 文檔:
PHP 支持一種錯誤控制運算符:at 符號 (@)。當附加到 PHP 中的表達式時,該表達式可能生成的任何診斷錯誤都將被抑制。
雖然在 WordPress 核心代碼中確實存在此運算符,但它經常被懶惰地使用,而不是進行適當的錯誤檢查。強烈建議不要使用它,甚至 PHP 文檔也指出:
警告:在 PHP 8.0.0 之前,@ 運算符可以禁用將終止腳本執行的嚴重錯誤。例如,將 @ 附加到不存在的函數調用之前,由于不可用或輸入錯誤,將導致腳本終止而沒有說明原因。
extract() 是一個非常糟糕的函數,它使代碼更難調試和更難理解,我們應該不應該使用它,并刪除現有代碼中的所有使用。
了美化網站,我在網站上面添加了一個HTML懸浮音樂播放器,先來看看一下效果圖。
如何在自己的網站上添加HTML懸浮音樂播放器呢?今天和你們分享
首先申明三點:
1、本播放器實際上是調用網易云音樂的音樂進行播放,音樂版權歸網易云音樂所有,僅供個人學習研究,用于商用的后果自負!
2、本播放器的演示效果可以在我的博客首頁看到,默認支持所有Html和PHP環境的網站。
3、本播放器可以使用電腦、手機、IPAD等設備訪問,自適應。)
具體的操作方法:
在網站源文件中(如果有單獨的頁腳文件,也可以放在頁腳文件里面)添加這三行代碼:
<!--音樂播放器-->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<script src="https://myhkw.cn/player/js/player.js" id="myhk" key="demo" m="1"></script>
然后保存發布,在瀏覽器刷新網頁就看到效果了
TML+PHP超大視頻上傳實例,PHP批量上傳大文件技巧,PHP批量上傳大文件,PHP實現批量上傳圖片的技巧,PHP結合WEB UPLOADER插件實現分段,PHP結合WEB UPLOADER插件實現切片上傳,PHP結合WEB UPLOADER插件實現斷點續傳,PHP結合WEB UPLOADER插件實現大文件上傳,PHP結合UPLOADER插件實現分片上傳文件,PHP結合百度UPLOADER插件實現分片上傳文件,PHP結合WEB UPLOADER插件實現分片上傳文件,前端HTML5,JS,JQ,VUE2,VUE3,React,
前端的話都有可能用到,VUE2,VUE3,HTML5,也不一定是VUE, 公司內部有自己的產品,有些產品是之前開發的,沒有用VUE,而是用的普通的HTML模板,用的也還好。
后端PHP5,PHP6,PHP7,PHP8,ThinkPHP,
客戶是武漢這邊的一家企業。
webuploader的組件公司研發部的同事也調研過,研究過他的實現,實際上他就是對Flash和HTML5進行了一個封裝,本質還是調的HTML5的API,兼容性不是特別好??蓴U展性也比較差,可維護性就更不用說了,之前公司項目遇到過坑,到現在連webuploader開發人員都聯系不上。想找他們尋求一點技術支持的幫助,真的是想都不要想。公司這一塊也愿意付費,就是付費尋求的技術支持,也不行。這一點真的讓哥幾個給整郁悶了。領導也不太滿意,所以還是找有技術支持的產品。研發部的同事稱這些項目是免費坑人項目。
服務器支持Linux,Windows,macOS,CentOS,中標麒麟,銀河麒麟,統信,龍芯,華為鯤鵬,
數據庫支持MySQL,達夢數據庫,人大金倉
需要提供前端源碼,后端源碼,控件源碼
需要提供7*24小時技術支持,長期技術支持,長期維護服務
需要提供手機,QQ,微信,企業微信,電子郵箱等聯系方式
需要支持包含IE在內的全部瀏覽器
終端需要支持Windows,macOS,Linux,信創國產化環境,中標麒麟,銀河麒麟,統信UOS,龍芯,華為
功能需要支持10G,50G,100G大文件上傳和斷點續傳,刷新續傳,重啟續傳
支持超大文件分片,分段,分塊,分割上傳下載,斷點續傳
支持文件夾上傳,下載斷點續傳,支持文件夾層級結構,層級結構信息保存到數據庫,下載的時候同樣保留層級結構
支持加密上傳,下載加密,端到端加密,國密SM4加密算法,數據加密傳輸,傳輸過程中要保證數據是加密的。
版本:6.5.40
代碼:https://gitee.com/xproer/up6-php/tree/6.5.40/
安裝環境
PHP:7.2.14
調整塊大小
NOSQL
NOSQL不需要任何配置,可以直接訪問測試
SQL
創建數據庫
您可以直接復制腳本進行創建
配置數據庫連接
6.安裝依賴
訪問頁面進行測試
數據表中的數據
相關參考:
文件保存位置
php5教程,
源碼工程文檔:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra
源碼報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl
OEM版報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a
控件源碼下載:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
*請認真填寫需求信息,我們會在24小時內與您取得聯系。