phpuseas
『壹』 php5.2使用use as的問題
5.3以上才支持命名空間,5.2當然會報錯了。
別再用5.2了,還是該與時俱進了,盡快的用php7吧。
『貳』 如何在php後端及時推送消息給客戶端
使用以下代碼可以更改設置。
『叄』 Thinkphp5.1 workerman Cannot use Workerman\Worker as Worker because the name is already
這個命名空間已經存在了,你需要重新定義一個新的命名空間。
『肆』 php use php namespace 到底是怎麼一回事
1. namespace Zend\Http\PhpEnvironment;
這句代碼定義了一個命名空間,你可以理解為定義一個名稱為 Zend\Http\PhpEnvironment 的域名。
在定義了之後,下面所申明的class, interface, const等都是在申明的這個「域」裡面的。當引用一個申明了命名空間的包含文件,想要調用這個裡面的東西,那就必須:
調整當前腳本也到這個域名里,否則,就得用namesapce的全稱。
比如,inc.php 文件:
namespace Zend\Http\PhpEnvironment;
class Bar {}//定義了一個類
則其他文件調用時:
// 訪問Foo的第一種方法,用全稱
require 'inc.php';
$foo = new \Zend\Http\PhpEnvironment\Bar();
// 訪問Foo的第二種方法
namespace Foo; // 調整當前腳本到Foo這個ns域,而且namespace申明必須在第一句
require 'inc.php';
$foo = new Bar();
2. use關鍵字目的是使用ns的別名:
比如說,上面的
// 訪問Foo的第一種方法,用全稱
require 'inc.php';
$foo = new \Zend\Http\PhpEnvironment\Bar();
用uses後,寫法如下:
use \Zend\Http\PhpEnvironment as pe; //定義別名
$foo = new \pe\Bar(); //用短的別名來代替原來的
如果省略後面的as ....,那麼,就可以直接用最後一節的文字來代替,比如,上面的:
use \Zend\Http\PhpEnvironment; //定義別名
$foo = new \PhpEnvironment\Bar(); //用短的別名來代替原來的
================================================
php官方手冊中的相關內容:
在PHP中,namespace命名空間用來解決在編寫類庫或應用程序時創建可重用的代碼如類或函數時碰到的兩類問題:
1. 用戶編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字沖突。
2. 為很長的標識符名稱(通常是為了緩解第一類問題而定義的)創建一個別名(或簡短)的名稱,提高源代碼的可讀性。
PHP 命名空間提供了一種將相關的類、函數和常量組合到一起的途徑。
PHP 命名空間支持有兩種使用別名或導入方式:為類名稱使用別名,或為命名空間名稱使用別名, 別名通過操作符 use 來實現。
『伍』 如何在php後端及時推送消息給客戶端
後端代碼
push.php
<?php
useWorkermanWorker;
require_once'./Workerman/Autoloader.php';
//初始化一個worker容器,監聽1234埠
$worker=newWorker('websocket://0.0.0.0:1234');
//這里進程數必須設置為1
$worker->count=1;
//worker進程啟動後建立一個內部通訊埠
$worker->onWorkerStart=function($worker)
{
//開啟一個內部埠,方便內部系統推送數據,Text協議格式文本+換行符
$inner_text_worker=newWorker('Text://0.0.0.0:5678');
$inner_text_worker->onMessage=function($connection,$buffer)
{
global$worker;
//$data數組格式,裡面有uid,表示向那個uid的頁面推送數據
$data=json_decode($buffer,true);
$uid=$data['uid'];
//通過workerman,向uid的頁面推送數據
$ret=sendMessageByUid($uid,$buffer);
//返回推送結果
$connection->send($ret?'ok':'fail');
};
$inner_text_worker->listen();
};
//新增加一個屬性,用來保存uid到connection的映射
$worker->uidConnections=array();
//當有客戶端發來消息時執行的回調函數
$worker->onMessage=function($connection,$data)use($worker)
{
//判斷當前客戶端是否已經驗證,既是否設置了uid
if(!isset($connection->uid))
{
//沒驗證的話把第一個包當做uid(這里為了方便演示,沒做真正的驗證)
$connection->uid=$data;
/*保存uid到connection的映射,這樣可以方便的通過uid查找connection,
*實現針對特定uid推送數據
*/
$worker->uidConnections[$connection->uid]=$connection;
return;
}
};
//當有客戶端連接斷開時
$worker->onClose=function($connection)use($worker)
{
global$worker;
if(isset($connection->uid))
{
//連接斷開時刪除映射
unset($worker->uidConnections[$connection->uid]);
}
};
//向所有驗證的用戶推送數據
functionbroadcast($message)
{
global$worker;
foreach($worker->uidConnectionsas$connection)
{
$connection->send($message);
}
}
//針對uid推送數據
functionsendMessageByUid($uid,$message)
{
global$worker;
if(isset($worker->uidConnections[$uid]))
{
$connection=$worker->uidConnections[$uid];
$connection->send($message);
returntrue;
}
returnfalse;
}
//運行所有的worker(其實當前只定義了一個)
Worker::runAll();
啟動後端服務
phppush.phpstart-d
前端接收推送的js代碼
varws=newWebSocket('ws://127.0.0.1:1234');
ws.onopen=function(){
varuid='uid1';
ws.send(uid);
};
ws.onmessage=function(e){
alert(e.data);
};
後端推送消息的代碼
//建立socket連接到內部推送埠
$client=stream_socket_client('tcp://127.0.0.1:5678',$errno,$errmsg,1,STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT);
//推送的數據,包含uid欄位,表示是給這個uid推送
$data=array('uid'=>'uid1','percent'=>'88%');
//發送數據,注意5678埠是Text協議的埠,Text協議需要在數據末尾加上換行符
fwrite($client,json_encode($data)." ");
//讀取推送結果
echofread($client,8192);
這里的uid不一定是用戶的id,也可以理解為任務id即 taskid
以上代碼親測可以直接使用
『陸』 PHP5.5 將會帶來哪些新特徵
1、放棄對Windows XP和2003 的支持
PHP5.5 將不再支持Windows XP和2003,這些系統已經有十年的歷史,所以PHP將不再提供支持。
2、棄用e修飾符
e修飾符是指示 preg_replace函數用來評估替換字元串作為PHP代碼,而不只是僅僅做一個簡單的字元串替換。不出所料,這種行為會源源不斷的出現安全問題。這就是為什麼在PHP5.5 中使用這個修飾符將拋出一個棄用警告。作為替代,你應該使用 preg_replace_callback函數。你可以從 RFC找到更多關於這個變化相應的信息。
新增函數和類
接下來,我們將看到在計劃之中的新增函數和類:
boolval()
PHP已經實現了strval、intval和floatval的函數。為了達到一致性將添加boolval函數。它完全可以作為一個布爾值計算,也可以作為一個回調函數。
hash_pbkdf2()
PBKDF2全稱「Password-Based Key Derivation Function 2」,正如它的名字一樣,是一種從密碼派生出加密密鑰的演算法。這就需要加密演算法,也可以用於對密碼哈希。更廣泛的說明和用法示例,請參閱 RFC。
intl 擴展
將有許多改進 intl的擴展。例如,將會有新的IntlCalendar,IntlGregorianCalendar,IntlTimeZone,IntlBreakIterator,IntlRuleBasedBreakIterator,IntlCodePointBreakIterator類。之前,我竟然不知道有這么多關於intl擴展,如果你想知道更多,我建議你去最新公告里找 Calendar和 BreakIterator。
array_column()
有一個 提議,新增array_column(或array_pluck)函數,它的表現如下:
<?php
$userNames = array_column($users, 'name');
// is the same as
$userNames = [];
foreach ($users as $user) {
$userNames[] = $user['name'];
}
像這樣從資料庫獲取一列,但返回是數組。
一個簡單的密碼散列API
最近的密碼泄漏(從LinkedIn等)顯示,即使是大型網站也不知道如何正確地散列密碼。幾年前人們一直提倡使用bcrypt,但大多數人似乎仍然是使用完全不安全的sha1哈希值。
我們認為這樣做的原因可能是真的很難使用crypt函數的API。因此我們會採用一個新的、簡單的API,用於安全的密碼散列:
<?php
$password = "foo";
// creating the hash
$hash = password_hash($password, PASSWORD_BCRYPT);
// verifying a password
if (password_verify($password, $hash)) {
// password correct!
} else {
// password wrong!
}
新的散列API提供了一些更多的特性,請參閱 RFC。
語言改變
現在真正有趣的東西:新的語言特性和增強功能。
常量引用
「常量引用」意味著數組可以直接操作字元串和數組字面值。舉兩個例子:
<?php
function randomHexString($length) {
$str = '';
for ($i = 0; $i < $length; ++$i) {
$str .= "0123456789abcdef"[mt_rand(0, 15)]; // direct dereference of string
}
}
function randomBool() {
return [false, true][mt_rand(0, 1)]; // direct dereference of array
}
我不認為在實踐中會使用此功能,但它使語言更加一致。請參閱 RFC。
調用empty()函數(和其他表達式)一起工作
目前,empty()語言構造只能用在變數,而不能在其他表達式。在特定的代碼像empty($this->getFriends())將會拋出一個錯誤。作為PHP5.5 這將成為有效的代碼。更多信息請參閱 RFC。
獲取完整類別名稱
PHP5.3 中引入命名空間的別名類和命名空間短版本的功能。雖然這並不適用於字元串類名稱:
<?php
use Some\Deeply\Nested\Namespace\FooBar;
// does not work, because this will try to use the global `FooBar` class
$reflection = new ReflectionClass('FooBar');
為了解決這個問題採用新的FooBar::class語法,它返回類的完整類別名稱:
<?php
use Some\Deeply\Nested\Namespace\FooBar;
// this works because FooBar::class is resolved to "Some\\Deeply\\Nested\\Namespace\\FooBar"
$reflection = new ReflectionClass(FooBar::class);
更多示例請參閱 RFC。
參數跳躍
如果你有一個函數接受多個可選的參數,目前沒有辦法只改變最後一個參數,而讓其他所有參數為默認值。
RFC上的例子,如果你有一個函數如下:
function create_query($where, $order_by, $join_type='', $execute = false, $report_errors = true) { ... }
那麼有沒有辦法設置$report_errors=false,而其他兩個為默認值。為了解決這個跳躍參數的問題而提出:
create_query("deleted=0", "name", default, default, false);
我個人不是特別喜歡這個提議。在我的眼睛裡,代碼需要這個功能,只是設計不當。函數不應該有12個可選參數。
標量類型提示
標量類型提示原本計劃進入5.4,但由於缺乏共識而沒有做。獲取更多關於為什麼標量類型提示沒有做進PHP的信息,請參閱: 標量類型提示比你認為的更難。
對於PHP5.5 而言,針對標量類型提示討論又一次出現,我認為這是一個相當不錯的 提議。
它需要通過輸入值來指定類型。例如:123,123.0,「123」都是一個有效的int參數輸入,但「hello world」就不是。這與內部函數的行為一致。
function foo(int $i) { ... }
foo(1); // $i = 1
foo(1.0); // $i = 1
foo("1"); // $i = 1
foo("1abc"); // not yet clear, maybe $i = 1 with notice
foo(1.5); // not yet clear, maybe $i = 1 with notice
foo([]); // error
foo("abc"); // error
Getter 和 Setter
如果你從不喜歡寫這些getXYZ()和setXYZ($value)方法,那麼這應該是你最受歡迎的改變。提議添加一個新的語法來定義一個屬性的設置/讀取:
<?php
class TimePeriod {
public $seconds;
public $hours {
get { return $this->seconds / 3600; }
set { $this->seconds = $value * 3600; }
}
}
$timePeriod = new TimePeriod;
$timePeriod->hours = 10;
var_mp($timePeriod->seconds); // int(36000)
var_mp($timePeriod->hours); // int(10)
當然還有更多的功能,比如只讀屬性。如果你想要知道更多,請參閱 RFC。
生成器
目前,自定義迭代器很少使用,因為它們的實現,需要大量的樣板代碼。生成器解決這個問題,並提供了一種簡單的樣板代碼來創建迭代器。
例如,你可以定義一個范圍函數作為迭代器:
<?php
function *xrange($start, $end, $step = 1) {
for ($i = $start; $i < $end; $i += $step) {
yield $i;
}
}
foreach (xrange(10, 20) as $i) {
// ...
}
上述xrange函數具有與內建函數相同的行為,但有一點區別:不是返回一個數組的所有值,而是返回一個迭代器動態生成的值。
獲取更深入的介紹請參閱 RFC。
列表解析和生成器表達式
列表解析提供一個簡單的方法對數組進行小規模操作:
$firstNames = [foreach ($users as $user) yield $user->firstName];
上述列表解析相等於下面的代碼:
$firstNames = [];
foreach ($users as $user) {
$firstNames[] = $user->firstName;
}
也可以這樣過濾數組:
$underageUsers = [foreach ($users as $user) if ($user->age < 18) yield $user];
生成器表達式也很類似,但是返回一個迭代器(用於動態生成值)而不是一個數組。
『柒』 php匿名函數中的use有什麼用
php文檔中關於use的說明
所有支持命名空間的PHP版本支持三種別名或導入方式:為類名稱使用別名、為介面使用別名或為命名空間名稱使用別名。PHP5.6開始允許導入函數或常量或者為它們設置別名。
在PHP中,別名是通過操作符use來實現的.下面是一個使用所有可能的五種導入方式的例子:
Example#1使用use操作符導入/使用別名
<?php
namespacefoo;
useMyFullClassnameasAnother;
//下面的例子與useMyFullNSnameasNSname相同
useMyFullNSname;
//導入一個全局類
useArrayObject;
//importingafunction(PHP5.6+)
usefunctionMyFullfunctionName;
//aliasingafunction(PHP5.6+)
;
//importingaconstant(PHP5.6+)
useconstMyFullCONSTANT;
$obj=newnamespaceAnother;//實例化fooAnother對象
$obj=newAnother;//實例化MyFullClassname對象
NSnamesubnsfunc();//調用函數MyFullNSnamesubnsfunc
$a=newArrayObject(array(1));//實例化ArrayObject對象
//如果不使用"useArrayObject",則實例化一個fooArrayObject對象
func();//
echoCONSTANT;//
?>
『捌』 PHP 的use 命名空間 是什麼意思
有點類似於 java 中的包機制,用來解決重名問題的,每一個命名空間都是獨立的專
給你舉個例子屬吧,比如我現在想寫兩個類,名字都叫 Action
<?php
namespaceA;//定義命名空間
classAction{
//..
}
namespaceB;//定義第二個命名空間
classAction{
//..
}
use 關鍵字用於導入某個命名空間下的類, 如果我在B空間內想使用A空間中的Action類,就需要導入這個類才能使用(當然也可以指明空間前綴來使用)
namespaceB;
//在本空間中需要使用A空間中的Action類,使用use導入
useAAction;//導入,如果本空間中也有一個Action會出現錯誤,因為類重名了
useAActionasA_Action;//通過取別名的方式解決
$var=newA_Action;
『玖』 php 官方手冊命名空間 use as 什麼意思
可能也是一個動態的意思, 下次更新類, 就只要在頭部修改即可
也可能就是一個別名
『拾』 php yii cuploadfile 為什麼上傳之後取不到
yii2利用自帶UploadedFile上傳圖片
創建一個 models/UploadForm.php:
namespace app\models;
use yii\base\Model;
use yii\web\UploadedFile;
/**
* UploadForm is the model behind the upload form.
*/
class UploadForm extends Model
{
/**
* @var UploadedFile file attribute
*/
public $file;
/**
* @return array the validation rules.
*/
public function rules()
{
return [
[['file'], 『file』],
];
}
}
視圖文件
<?php
use yii\widgets\ActiveForm;
?>
<?php $form = ActiveForm::begin([『options』 => ['enctype' => 'multipart/form-data']]) ?>
<?= $form->field($model, 『file』)->fileInput() ?>
<button>Submit</button>
<?php ActiveForm::end() ?>
控制器
use app\models\UploadForm;
use yii\web\UploadedFile;
public function actionUpload()
{
$model = new UploadForm();
if (Yii::$app->request->isPost) {
$model->file = UploadedFile::getInstance($model, 『file』);
if ($model->file && $model->validate()) {
$model->file->saveAs(『uploads/』 . $model->file->baseName . 『.』 . $model->file->extension);
}
}
return $this->render(『upload』, ['model' => $model]);
}