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]);
}