虽然这个问题在某种程度上与语言无关(对于支持Traits的OOP语言是不可知的)但我一直在修补PHP 5.4a的夜间版本,并且遇到了奇怪的情况.我似乎无法让我的安装再次运行,但这是另一个故事.
给出以下代码段:
trait MyTrait
{
public function myMethod(self $object)
{
var_dump($object);
}
}
class MyClass
{
use MyTrait;
}
$myObject = new MyClass();
$myObject->myMethod('foobar'); // <-- here
Run Code Online (Sandbox Code Playgroud)
应该怎么办?我希望有一个错误,表明$object需要成为一个实例MyClass.
当trait方法被复制到use-ing类中时,它们是逐字复制的,以解决类似这样的类继承引用吗?这是Trait的预期功能吗?(我没有使用过支持他们的另一种语言)
(我知道这可能是一个敏感的决定,但我很欣赏我们避免答案,如"请不要.")
我有一个类,其构造函数将回调作为参数.在这个回调中,我认为在语义上最正确的是$this变量可用作对回调所属实例的引用.(我注意到5.4已经在一个类中定义$this的匿名函数的上下文中恢复,但是即使这个更改也没有帮助,因为函数作为参数传递给构造函数,如上所述)
问题来自这样一个事实:实例没有作为参数传递给回调,而是通过它提供 use()
use()有哭的倾向$this,说它不能用作词汇变量.
有没有办法,没有把它作为一个论点(任何方法,use()或不是,可能很好)来完成这个?
在手边,我唯一能想到的就是:
... function($foo, $bar)
use($array_with_this){
extract($array_with_this); // contains instance with key 'this'
// code using $this
} ...
Run Code Online (Sandbox Code Playgroud)
但这迫使我不再需要额外的要求.
我之前问过一个问题,基本上采用$null = null了给定的方法,在 PHP 中返回一个空引用。
经过一些粗略的谷歌搜索后,我没有出现太多。让我假设上述方法是最好的(只读)方法。然而,对我来说,PHP 将(仍然)无法支持这样的功能似乎很奇怪。
不管怎样,如果不清楚;在 PHP 中通过引用从函数返回什么(其他,如果有的话)方法null?我特别询问返回空引用,而不是为了解释我的链接问题而浮出水面的三元运算符问题。
例如:
function &return_null(){
return null;
}
$null_ref = return_null(); // fails
Run Code Online (Sandbox Code Playgroud)
然而:
function &return_null(){
$null = null;
return $null;
}
$null_ref = return_null(); // succeeds
Run Code Online (Sandbox Code Playgroud)
我问是因为我在创建可重用库时有点强迫症;我真的很喜欢干净的代码,不管它在给定的语言中可以变得多么干净。使用占位符$null = null会使我的皮肤爬行,尽管它实现了所需的功能。
为了完整起见@ yes123,这里是这个问题所在的方法片段:
public static function &getByPath(Array &$array, $path, $delimiter){
if(!is_array($path)){
$path = explode($delimiter, $path);
}
$null = null;
while(!empty($path)){
$key = array_shift($path);
if(!isset($array[$key])){
return $null;
}
if(!empty($path) && …Run Code Online (Sandbox Code Playgroud) 我是使用XML模式的新手,所以请原谅我的无能,如果这比我自己认为必须的更微不足道.
我正在尝试创建一个必需的属性,该属性必须包含一个或多个列表中以空格分隔的字符串值.该列表是4种典型的HTTP请求方法; get,post,put,和delete.
所以有效的元素包括:
<rule methods="get" />
<rule methods="get post" />
<rule methods="post put delete" />
Run Code Online (Sandbox Code Playgroud)
而无效元素包括:
<rule methods="get get" />
<rule methods="foobar post" />
<rule methods="get;post;put" />
Run Code Online (Sandbox Code Playgroud)
我试着用枚举和长度来愚弄,但我不相信我理解我需要做什么(或者如果它实际上是可能的话,尽管看起来好像应该这样)
这就是我现在所处的位置,感谢@tdrury:
<xs:attribute name="methods" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse" />
<xs:pattern value="(?:(?:get|post|put|delete)\s?){1,4}" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
Run Code Online (Sandbox Code Playgroud)
哪个有效,除了重复(如get get或post post post)和缺少空格(如getpost或postputdelete)
编辑:
在玩了一下之后,我提出了一个想法:列举所有可能的序列.值得庆幸的是,这份名单是(暂时)固定在四个通常的运输方式,get,post,put,和delete …
完成菜鸟C,只是开始一些游手好闲,想知道如何(读" 如果 ")以下是可能的.
尝试struct使用作为函数指针的成员创建一个,并且函数指针指向一个函数,该函数接受与前述类型相同的参数struct.例如(注意语法,只是熟悉这里):
typedef struct{
void (*myStructFunc)(void);
} MyStructType;
void myFunc(void){
printf("Hello world!");
}
// ...
MyStructType myStruct;
myStruct.myStructFunc = &myFunc;
myStruct.myStructFunc(); // <= Hello world!
Run Code Online (Sandbox Code Playgroud)
这工作正常,但是当我尝试将MyStructType类型的参数引入函数时:
typedef struct{
void (*myStructFunc)(*MyStructType); // <= parse error
} MyStructType;
void myFunc(MyStructType *myStruct){
printf("Hello world!");
}
// ...
MyStructType myStruct;
myStruct.myStructFunc = &myFunc;
myStruct.myStructFunc(&myStruct);
Run Code Online (Sandbox Code Playgroud)
这些例子很简单,原因很明显,但它们说明了我的意图.再次,只是让我的脚湿透C所以请原谅任何语法上的无知.
无论如何,我怎么能实现这个目标?很明显,我在语法上做了一些不正确的事情,或者我正在尝试做一些明显不可能的事情.
还要注意,其原因纯粹是学术性的.
我想知道enum在struct(inC)中使用a 的语法
我已经看过各种例子,其中struct+ union/ enum组合用于创建复杂类型,例如:
struct MyStruct{
enum{
TYPE_1,
TYPE_2,
TYPE_3,
} type;
union{
int value_1;
int value_2;
int value_3;
} value;
};
// ...
struct MyStruct test_struct;
Run Code Online (Sandbox Code Playgroud)
无论如何,从这个例子中,我将如何根据enum字段存储/测试当前的"类型" ?
如果我有指针test_struct,这似乎不起作用; 踢回未知成员错误:
struct MyStruct *test_pointer = &test_struct;
test_pointer->value = test_pointer->VALUE_1;
Run Code Online (Sandbox Code Playgroud)
我只是好奇,我是否需要将enum值作为全局值来访问?
test_pointer->value = VALUE_1;
Run Code Online (Sandbox Code Playgroud)
任何澄清将不胜感激.
有没有办法include有效地缓存PHP 以便重用,没有APC,等等?
简单(尽管很愚蠢)的例子:
// rand.php
return rand(0, 999);
// index.php
$file = 'rand.php';
while($i++ < 1000){
echo include($file);
}
Run Code Online (Sandbox Code Playgroud)
同样,虽然荒谬,但这对脚本会丢弃1000个随机数.但是,对于每次迭代,PHP必须命中文件系统(正确?没有遗漏的缓存功能,我错过了,是吗?)
基本上,如何防止前一个场景导致文件系统的1000次点击?
到目前为止我唯一考虑的是一个傻瓜,它可能根本没有效果(没有经过测试,在这里写,容易出错,但你明白了):
// rand.php
return rand(0, 999);
// index.php
$file = 'rand.php';
$cache = array();
while($i++ < 1000){
if(isset($cache[$file])){
echo eval('?>' . $cache[$file] . '<?php;');
}else{
$cache[$file] = file_get_contents($file);
echo include($file);
}
}
Run Code Online (Sandbox Code Playgroud)
一个更现实,更不愚蠢的例子:
当包含用于视图生成的文件时,给定视图文件在给定请求(窗口小部件或其他东西)中被多次使用是否有一种现实的方法来捕获和重新评估视图脚本而没有文件系统命中?
快一点; 用于PHP开发的Netbeans 7.0:
有没有办法通知NetBeans何时class_alias用于别名类,从而触发别名的代码完成?
class Foo{
public static $hello = 'world';
}
class_alias('Foo', 'Bar');
Bar::$h // triggers code completion for $hello
^
Run Code Online (Sandbox Code Playgroud)
我仍然在努力变得熟练使用NetBeans,并且没有真正使用配置,所以我希望有一些我可以修改的项目特定配置.
在此先感谢大家.
有趣的是,我能 不能请参阅下文,而不是使用命名空间的use(虽然我的项目,否则命名空间免费),达到什么样的NetBeans将明白:
class Foo{
public static $hello = 'world';
}
use \Foo as Bar;
Bar::$h // DOES trigger code completion for $hello
^
Run Code Online (Sandbox Code Playgroud)
我不知道这是否是一个可行的解决方案.我的Loader类还包含一个映射,alias => classname当给定的类自动加载时,load方法会在必要时搜索映射和别名.
这不会像希望的那样工作,use完全不适合任何类型的动态别名:
use在函数或方法中发出解析错误.use不支持动态命名; use \{$class} as {$alias};是非法的.use不进行文件包含,从而使其使用......好吧,没用.潘-tastic.鉴于我有一个如下数组:
$array = array('a', 'b', 0, 'c', null, 'd');
Run Code Online (Sandbox Code Playgroud)
现在,我可以轻松地迭代它foreach:
foreach($array as $value){
var_dump($value);
}
Run Code Online (Sandbox Code Playgroud)
一切都很好,很好.但是,如果我想" 查看 "以查看我是否在最后一个元素上,则以下内容将不起作用:
reset($array);
while($value = current($array)){
var_dump($value);
if(next($array)){
// this won't be accurate because of the 0 element
}
}
Run Code Online (Sandbox Code Playgroud)
好的,所以我做了更严格的测试:
if(null !== next($array)){
// this STILL won't be accurate because of the null element
}
Run Code Online (Sandbox Code Playgroud)
是使用for带算术偷看的索引循环的唯一解决方案吗?我不认为这可以保持关联密钥的完整性而不需要大量的闲逛.(我知道我的例子并不例证这个警告,但我换current()了each(),并next()为current())
有没有万无一失的方法来准确地确定数组指针是否已经移动经过阵列的端部,不管阵列元素值(null,0等)
警告; 当然,使用临时变量存在大量的解决方案,但这种操作只需要肮脏和愚蠢.我很惊讶没有简洁的解决方案.
嗯,这绝不是一个完美的解决方案,因为Note但是这里是: …array_keys()正在创建一个新的数组
class CoOrds
{
public int x, y;
public CoOrds() {
x = 0;
y = 0;
}
public CoOrds(int x, int y) {
this.x = x;
this.y = y;
}
}
public CoOrds toto() {
CoOrds B = new CoOrds(3, 2);
return B;
}
private void result_Click(object sender, EventArgs e) {
l6.Text = "";
CoOrds D = new CoOrds();
D = toto();
l6.Text = "(" + D.x + "," + D.y + ")";
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Error 2 Inconsistent accessibility: return …