<?php namespace KzykHys\Text; class Text implements \Serializable { private $text; public function __construct($text = '') { $this->text = (string) $text; } /** * @param string $text */ public static function create($text = '') { return new static($text); } /** * Append the string * * @param string $text * * @return Text */ public function append($text) { $this->text .= (string) $text; return $this; }PHP 擁有的多種函數可供建立、讀取、上傳以及編輯文字注意:請謹慎操作文字! 當您操作文字時必須非常小心。如果您操作失誤,可能會造成非常嚴重的破壞。常見的錯誤是:編輯錯誤的文本,被垃圾資料填滿硬碟,意外刪除檔案內容
<?php // Copyright (c) Lellys Informática. All rights reserved. See License.txt in the project root for license information. namespace Collections; /** * Provides functionality to evaluate queries against a specific data source wherein the type of the data is not * specified. */ interface CollectionInterface extends ConstCollectionInterface, OutputCollectionInterface { /** * Removes all items from the collection. * @return void */ public function clear(); }取得一個集合的語法與取得資料庫時相同:一個集合相當於一張表。 (如果你對關係型資料庫比較熟悉)
<?php spl_autoload_register(function ($className) { $className = ltrim($className, '\'); $fileName = ''; if ($lastNsPos = strripos($className, '\')) { $namespace = substr($className, 0, $lastNsPos); $className = substr($className, $lastNsPos + 1); $fileName = str_replace('\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; } $fileName = __DIR__ . DIRECTORY_SEPARATOR . $fileName . $className . '.php'; if (file_exists($fileName)) { require $fileName; return true; } return false; });例如call_user_func()函數就可接收使用者自訂的函數作為一個參數,他是php的內建函數。 callback函數不但可以是一個函數,也可以是一個物件的方法,靜態類別的方法也可以。一個php函數用函數名稱字串來傳遞,可以傳遞任何內建的或使用者自訂的函數,除了語言結構例如array(),echo(),empty(),eval(),exit(),isset() ,list(),print(),unset()等。 如果要傳入一個物件的方法,需要以陣列的形式傳遞,陣列下標0是物件名,下標1是方法名。要是沒有實例化為物件的靜態類,要傳遞其方法,要將數組0下標指明的物件名稱換成該類別的名稱。
<?php namespace Dflydev\Canal\Analyzer; use Dflydev\Canal\Metadata\Metadata; class AnalyzerTest extends \PHPUnit_Framework_TestCase { public function testKnownType() { $analyzer = new Analyzer; $internetMediaType = $analyzer->detectFromFilename('/path/to/some-file.html'); $this->assertEquals('text/html', $internetMediaType->asString()); } public function testFallback() { $analyzer = new Analyzer; $internetMediaType = $analyzer->detectFromFilename('/path/to/some-file.canal-extension-foo'); $this->assertEquals('application/octet-stream', $internetMediaType->asString()); }本類別庫實現對網站全流量、使用者結構、存取路徑、存取內容、以及存取地點等關鍵指標進行深度追蹤的監測工具,真實地反映網站實際流量狀況以及網路使用者存取體驗狀況。
<?php class ParaTestApplication extends Application { const NAME = 'ParaTest'; const VERSION = '1.0.1'; public function __construct() { parent::__construct(static::NAME, VersionProvider::getVersion(static::VERSION)); } public function doRun(InputInterface $input, OutputInterface $output) { $this->add(new ParaTestCommand(new PHPUnit())); return parent::doRun($input, $output); }並行測試技術是把平行技術引入測試領域中所形成的方法和技術。就是可以較好地完成同時測試多個被測對象(UUTs)任務的一種先進測試方法和技術。並行測試是建立在平行概念基礎上的。並行測試 的核心是可以同時對多個被測對象進行測試。並行測試主要是透過在不同被測物件間切換,以實現並行測試。各個被測對象的測試過程都是獨立並行的,一個被測對象的測試並不要等到另一個被測對象的測試完畢後方能進行。但每個被測對象內部測試過程還是按順序測試的,因此說,這種並行測試方式對測試系統的測試性能和儀器利用率提高有限,其提升餘地還很大
<?php namespace Symfony\Component\DependencyInjection; use Symfony\Component\DependencyInjection\Exception\BadMethodCallException; use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException; class ChildDefinition extends Definition { private $parent; public function __construct(string $parent) { $this->parent = $parent; $this->setPrivate(false); } public function getParent() { return $this->parent; }什麼是依賴注入? IOC:英文全名:Inversion of Control,中文名稱:控制反轉,它還有個名字叫做依賴注入(Dependency Injection,簡稱DI)。當一個類別的實例需要另一個類別的實例協助時,在傳統的程式設計過程中,通常由呼叫者來建立被呼叫者的實例。而採用依賴注入的方式,創建被呼叫者的工作不再由呼叫者來完成,因此叫控制反轉,創建被呼叫者的實例的工作由IOC容器來完成,然後注入呼叫者,因此也稱為依賴注入。
<?php function get_rand($proArr) { $result = ''; //概率数组的总概率精度 $proSum = array_sum($proArr); //概率数组循环 foreach ($proArr as $key => $proCur) { $randNum = mt_rand(1, $proSum); if ($randNum <= $proCur) { $result = $key; break; } else { $proSum -= $proCur; } } unset ($proArr); return $result; }獎項數組是一個二維數組,記錄了所有本次抽獎的獎項信息,其中id表示中獎等級,prize表示獎品,v表示中獎概率。注意其中的v必須為整數,你可以將對應的獎項的v設定成0,即意味著該獎項抽中的幾率是0,數組中v的總和(基數),基數越大越能體現機率的準確性。本例中v的總和為100,那麼平板電腦對應的 中獎機率就是1%,如果v的總和是10000,那中獎機率就是萬分之一了。 $proArr是一個預先設定的數組,假設數組為:array(100,200,300,400),開始是從1,1000 這個機率範圍內篩選第一個數是否在他的出現機率範圍之內,如果不在,則將機率空間,也就是k的值減去剛剛的那個數字的機率空間,在本例當中就是減去100,也就是說第二個數是在1,900這個範圍內篩選的。這樣 篩選到最終,總會有一個數滿足要求。就等於去一個箱子裡摸東西,第一個不是,第二個不是,第三個還不是,那最後一個一定是。這個演算法簡單,而且效率非常 高,關鍵是這個演算法已在我們先前的專案中有應用,尤其是大數據量的專案中效率非常棒。
<?php function import($class, $baseUrl = '', $ext='.class.php') { static $_file = array(); $class = str_replace(array('.', '#'), array('/', '.'), $class); if ('' === $baseUrl && false === strpos($class, '/')) { // 检查别名导入 return alias_import($class); } if (isset($_file[$class . $baseUrl])) return true; else $_file[$class . $baseUrl] = true; $class_strut = explode('/', $class); if (empty($baseUrl)) { if ('@' == $class_strut[0] || APP_NAME == $class_strut[0]) { //加载当前项目应用类库 $baseUrl = dirname(LIB_PATH); $class = substr_replace($class, basename(LIB_PATH).'/', 0, strlen($class_strut[0]) + 1); }elseif ('think' == strtolower($class_strut[0])){ // think 官方基类库 $baseUrl = CORE_PATH; $class = substr($class,6); }elseif (in_array(strtolower($class_strut[0]), array('org', 'com'))) { // org 第三方公共类库 com 企业公共类库 $baseUrl = LIBRARY_PATH; }else { // 加载其他项目应用类库 $class = substr_replace($class, '', 0, strlen($class_strut[0]) + 1); $baseUrl = APP_PATH . '../' . $class_strut[0] . '/'.basename(LIB_PATH).'/'; } }導入所需的類別庫同java的Import本函數有快取功能@param string $class 類別庫命名空間字串 #@param string $baseUrl 起始路徑@param string $ext 匯入的檔案副檔名
<?php class MimeTypes { public static $mime_types = array ( 'apk' => 'application/vnd.android.package-archive', '3gp' => 'video/3gpp', 'ai' => 'application/postscript', 'aif' => 'audio/x-aiff', 'aifc' => 'audio/x-aiff', 'aiff' => 'audio/x-aiff', 'asc' => 'text/plain', 'atom' => 'application/atom+xml', 'au' => 'audio/basic', 'avi' => 'video/x-msvideo', 'bcpio' => 'application/x-bcpio', 'bin' => 'application/octet-stream', 'bmp' => 'image/bmp', 'cdf' => 'application/x-netcdf', 'cgm' => 'image/cgm', 'class' => 'application/octet-stream', 'cpio' => 'application/x-cpio', 'cpt' => 'application/mac-compactpro', 'csh' => 'application/x-csh', 'css' => 'text/css',本類別庫可以獲得檔案的mime type類型,需要的朋友可以下載使用
<?php class ArrayHelper{ static function removeEmpty(& $arr, $trim = TRUE) { foreach ($arr as $key => $value) { if (is_array($value)) { self::removeEmpty($arr[$key]); } else { $value = trim($value); if ($value == '') { unset($arr[$key]); } elseif ($trim) { $arr[$key] = $value; } } } }從陣列中刪除空白的元素(包括只有空白字元的元素)#用法:@code php$arr = array('', 'test', ' ');ArrayHelper::removeEmpty($arr);dump($arr);#輸出結果中將只有'test'@endcode@param array $arr 要處理的陣列@param boolean $trim 是否對陣列元素呼叫trim 函數
<?php class Logic_BlackWord { const APP_FORUM = 1; const APP_BLOG = 2; const APP_VOTE = 3; public function getHitList($txt) { $hitList = array(); $max = $this->getMax(); if($max) { $size = 1000; $last = ceil($max/$size); for($page=1;$page<=$last;$page++) { $result = $this->getHitListByPage($txt,$page,$size); if($result) $hitList = array_merge($hitList,$result); } } $hitList2 = array(); foreach($hitList as $hit=>$type) { $hitList2[$type][] = $hit; } return $hitList2; }本類庫的敏感詞替換演算法,效率比str_replace高4倍(附6仟個敏感詞),這個類庫是沒有學習過Trie樹的時候寫的,之後我接觸了AC算法,我的演算法和AC是類似的結構和邏輯,都是利用樹,空間換時間,對搜尋/取代海量資料幫助很明顯。 strtr是KMP演算法的代表,在對待海量詞彙上面,並無優勢,每次都要載入詞庫到記憶體。 使用AC演算法寫成擴展,將詞庫載入記憶體中,是最好的處理方式。 所以badword.src.php可供學習AC演算法、學習尋找替換等。
<?php class sqlsafe { private $getfilter = "'|(and|or)\b.+?(>|<|=|in|like)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)"; private $postfilter = "\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)"; private $cookiefilter = "\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)"; public function __construct() { foreach($_GET as $key=>$value){$this->stopattack($key,$value,$this->getfilter);} foreach($_POST as $key=>$value){$this->stopattack($key,$value,$this->postfilter);} foreach($_COOKIE as $key=>$value){$this->stopattack($key,$value,$this->cookiefilter);} } public function stopattack($StrFiltKey, $StrFiltValue, $ArrFiltReq){ if(is_array($StrFiltValue))$StrFiltValue = implode($StrFiltValue); if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue) == 1){ $this->writeslog($_SERVER["REMOTE_ADDR"]." ".strftime("%Y-%m-%d %H:%M:%S")." ".$_SERVER["PHP_SELF"]." ".$_SERVER["REQUEST_METHOD"]." ".$StrFiltKey." ".$StrFiltValue); showmsg('您提交的参数非法,系统已记录您的本次操作!','',0,1); } } public function writeslog($log){ $log_path = CACHE_PATH.'logs'.DIRECTORY_SEPARATOR.'sql_log.txt'; $ts = fopen($log_path,"a+"); fputs($ts,$log."\r\n"); fclose($ts); } }本類別庫首先建構函數參數,然後檢查並寫日誌最後檢查SQL注入日誌。是一個很好用的防SQL注入的php類別函式庫#