有没有办法可以隐含地将顶级变量声明为闭包中使用的全局变量?
例如,如果使用如下代码:
$a = 0; //A TOP-LEVEL VARIABLE
Alpha::create('myAlpha')
->bind(DataSingleton::getInstance()
->query('c')
)
->addBeta('myBeta', function($obj){
$obj->bind(DataSingleton::getInstance()
->query('d')
)
->addGamma('myGamma', function($obj){
$obj->bind(DataSingleton::getInstance()
->query('a')
)
->addDelta('myDelta', function($obj){
$obj->bind(DataSingleton::getInstance()
->query('b')
);
});
})
->addGamma('myGamma', function($obj){
$a++; //OUT OF MY SCOPE
$obj->bind(DataSingleton::getInstance()
->query('c')
)
.
.
.
Run Code Online (Sandbox Code Playgroud)
从这样的方法调用闭包:
public function __construct($name, $closure = null){
$this->_name = $name;
is_callable($closure) ? $closure($this) : null;
}
Run Code Online (Sandbox Code Playgroud)
所以在summary/TL; DR中,有没有一种方法可以隐式地将变量声明为全局,以便在不使用global关键字或$GLOBALS超全局的闭包(或其他函数)中使用?
我在另一个频繁的论坛上开始讨论这个话题(http://www.vbforums.com/showthread.php?p=3905718#post3905718)
我对过去几周/几个月的MVC类型架构的理解已经大大提升了(我会说),我非常感谢SO的爱好者们.所以谢谢!
我仍然受到某种挑战的挑战Model.到目前为止,我已整理并创建;
Request对象,它整合了请求数据(GET/POST/etc.参数,HTTP标头等)Response对象,用于收集响应数据(HTML,JSON,HTTP标头等)Router对正则表达式驱动的路由表解析URI 的想法,基于Controller文件/类存在/继承验证它们,并Request使用任何补充参数更新对象.Dispatcher对象,用于设置工作环境,创建和初始化必要的对象Controller,并将其Request与Response对象一起发送.现在了Model.
据我所知,在很多(有些)情况下,Model仅仅是代表性的它相关的实体,表,带有CRUD方法(addUser(),deleteUser()等),在另一些国家也有抽象的进一步水平,防止控制器访问进行更加细致的CRUD功能,巩固方法(replaceUser()- 删除,添加,然后返回用户数据)
我想知道我最好的行动方式是什么; 由于一些具体原因.
我创建了一个Gateway类,它充当预期的Model执行ACL检查的代理(使用Acl对象,特殊情况" Model"),使用Request所需的方法和参数作为检查的参数.该Controller负责确定失败的ACL检查的结果(显示所有但是该数据,重定向等等)
我还介绍了一个(我以前称之为混合REST/RPC,但我认为这是不正确的,因为我的资源URI架构是窗口外的)RPC API层.API调用由一个方法,参数和请求参数组成,由特殊管理,ApiController并像正常Model调用一样被馈送Gateway.
在我看来,这是促进数据访问的最佳方式,是一个(呃 - 哦)单个巨大的模型对象,忽略任何维护所有数据库交互方法的ORM,证明管理网关/ ACL /模型关系的简单性.不,这听起来不对.
鉴于这些建筑选择,我可能是建模我的最佳选择,嗯.. Model?我是否真的通过前面提到的设计选择谨慎和最佳实践?
虽然我被认为可能只是一个设计选择,但将PHP中的属性初始化为显式是否有任何优势null?
作为一种习惯的力量,我发现自己在做:
// ...
protected $_foo = null;
protected $_bar = null;
protected $_baz = null;
// ...
Run Code Online (Sandbox Code Playgroud)
当然,在实际数据打算出现在对象实例化的情况下,有目的:
// ...
protected $_array = array('a', 'b', 'c');
protected $_boolean = true;
// ...
Run Code Online (Sandbox Code Playgroud)
是否遗漏null初始化值在功能上完全等同于包含null初始化?还有其他警告吗?此外,除非在进行任何赋值之前对属性进行类型检查,否则对空数组的初始化似乎是类似的情况(我发现自己经常这样做)
这有点傻,因为它反对解放Javascript的标记,但不管怎么说我都会问.
鉴于此片段:
<p>Hello</p>
<script type="text/javascript">
$(document).ready(function(){
$('relative-selector').next('p').hide();
});
</script>
<p>World</p>
Run Code Online (Sandbox Code Playgroud)
此片段将<script>使用此" 相对选择器 " 定位标记本身,.next('p').hide()并将导致<p>World</p>隐藏.
是否存在" 相对选择器 ",或者指定给定代码段所在的脚本标记的方法?
我正在寻找的答案(如果存在这样的答案)将不需要使用id属性或任何此类识别属性; <script>无论DOM树中的位置如何,它都可以在给定文档中使用任意数量的标记.
我已经看到了一些不使用的奇怪实现$(document).ready(),而是依赖于剩余标记未加载,使用$('script:last')或某些此类混合的事实.这不是我想要的; 我想要.bind()一些处理程序相对于绑定脚本片段的元素(通常在之后,这就是为什么卸载的标记技巧不起作用)
$(this)document由于ready处理程序而简单地定位对象.$(this)在负载延迟处理程序目标之外window.
我已经几乎已经接受了这可能是不可能的,但是我确定是否存在任何解决方案,它在SO用户的脑海中漂浮.
鉴于以下课程:
public class MyType
{
public static implicit operator MyType(Func<MyType> wrapper) {
return wrapper();
}
}
Run Code Online (Sandbox Code Playgroud)
从隐式演员Func<MyType>到MyType,我假设以下是可能的:
public MyType MyTypeWrapper() {
return new MyType();
}
public void MyTestMethod() {
MyType m = MyTypeWrapper; // not a call!
}
Run Code Online (Sandbox Code Playgroud)
但是我得到了:
无法将方法组"MyTypeWrapper"转换为非委托类型"Test.MyType".你打算调用这个方法吗?
其中,不幸的是对我,对搜索时(如我预期的一半),导致吨 的 问题,这个问题的答案是:
嘿,你打瞌睡; 折腾
()结束了WhateverMethod!
现在,当我输入这个时,我注意到显式转换实际上是编译的:
MyType m = (MyType) MyTypeWrapper;
Run Code Online (Sandbox Code Playgroud)
为什么我不能隐式转换一个Func<MyType>来MyType为我所描述?
我一直在阅读SO和其他地方,但我似乎无法找到任何结论.
有没有办法通过此调用堆栈有效地携带引用,从而产生所需的功能,如下面的示例所述?虽然该示例并未尝试解决此问题,但它确实说明了问题:
class TestClass{
// surely __call would result similarly
public static function __callStatic($function, $arguments){
return call_user_func_array($function, $arguments);
}
}
// note argument by reference
function testFunction(&$arg){
$arg .= 'bar';
}
$test = 'foo';
TestClass::testFunction($test);
// expecting: 'foobar'
// getting: 'foo' and a warning about the reference
echo $test;
Run Code Online (Sandbox Code Playgroud)
只关注call_user_func_array(),我们可以确定(至少在PHP 5.3.1中)你不能通过引用隐式传递参数:
function testFunction(&$arg){
$arg .= 'bar';
}
$test = 'foo';
call_user_func_array('testFunction', array($test));
var_dump($test);
// string(3) "foo" and a warning about the non-reference parameter
Run Code Online (Sandbox Code Playgroud)
通过显式传递数组元素$test …
我已经开发了一个小而有效的MVC样式框架,用于应用程序,我正在实现ACL每请求检查.
快速详情:PHP 5.3+; MySQL 5.1+; 自定义框架,"类似MVC"
截至目前,ACL检查很简单" deny-if-not white-listing "; 每个都group可以被分配给某些请求处理程序的权限.例如:
privilege permission
+----------+---------------+ +---------------+---------------+
| group_id | permission_id | | permission_id | handler_key |
+----------+---------------+ +---------------+---------------+
| 1 | 1 | | 1 | lorem_ipsum |
| 1 | 2 | | 2 | hello_world |
| 2 | 3 | | 3 | foobar |
+----------+---------------+ +---------------+---------------+
Run Code Online (Sandbox Code Playgroud)
(为简洁user而group排除,但他们的模型并不罕见)
无论如何,我的框架handler_key通过处理程序/路径表将 URI路由到适当的(以解耦文件系统体系结构)然后将请求分派给处理程序,因为group_id与请求关联的请求是白名单的handler_key.
我很好奇,实现存储/检查任意( …
NetBeans 7.0上的快速版本和PHP的自动完成功能;
我试图弄清楚(如果可能的话)如何__get()在类中强制实现返回(引用)某种类型,类型__get()是实现的同一类,总是如此.
现在,我有(在View):
/**
* @param string $key
* @return View
*/
public function __get($key){
return $this->getView($key);
}
Run Code Online (Sandbox Code Playgroud)
像这样访问:
$view->foo-> // should populate with methods from View
^
Run Code Online (Sandbox Code Playgroud)
现在我一直在阅读@property,但我不确定这对我正在做的事情是否正确.另一件事是(如果可能的话,这将是一个很好的功能)通常是嵌套的视图,所以在我的实现中看到这个并不罕见:
$view->foo->bar->baz-> // should populate with methods from View
^
Run Code Online (Sandbox Code Playgroud)
关于如何强迫这个,或者我被卡住的任何想法?
更新:
因此@property似乎正朝着正确的方向前进,但似乎没有支持通配名称.那么为了详细说明我的问题,有没有人知道任何NetBeans插件,或者没有文档(或者只是很难找到)PHPDoc语法来支持通配符@property名称?
我正在考虑以下其中一个方向:
/**
* @property View *
* @property View ...
* @property View $var,...
*/
Run Code Online (Sandbox Code Playgroud)
当然,这些变化都不起作用,但最后看起来最符合逻辑,因为它们似乎支持可变参数函数参数列表的类似语法.
该DOA(或者更准确,死之前到达)XHTML2工作标准表示支持的<di>标签.
[...]该术语及其定义可以在一个
di要素中分组,以帮助澄清术语与其定义之间的关系.
为了澄清,此标记将用于在以下位置分组<dt>和<dd>标记<dl>:
<dl>
<di>
<dt>defenestrate</dt>
<dd>throw through or out of the window; "XHTML2 was defenestrated"</dd>
<dd>what I will do if web standards keep going they way they are</dd>
</di>
</dl>
Run Code Online (Sandbox Code Playgroud)
无论如何,既然<di>是在窗外(嘿),我想知道当前支持的标记模式是什么(如果有的话)可以被描述为语义和结构上的等价?我基本上接受了这<dl>不足以满足我的要求(就美学要求而言),所以我正在研究其他解决方案.
我的意图<di>主要是一个样式钩子1,因为我正在使用一个定义列表,并打算将术语/定义分组设计为单个项目.
为了便于访问,我将使用aria-*和role属性来帮助定义关系,但我希望存在一些普遍接受的模拟结构<di>,我根本没有遇到过.
例如,我正在考虑以下内容:
<ul>
<li>
<dfn id="term-1">term</dfn>
<p aria-labelledby="term-1">definition for term 1</p> …Run Code Online (Sandbox Code Playgroud) 在PHP 5.3.6中,我注意到以下内容不起作用:
class Foo{
public static $class = 'Bar';
}
class Bar{
public static function sayHello(){
echo 'Hello World';
}
}
Foo::$class::sayHello();
Run Code Online (Sandbox Code Playgroud)
发行unexpected T_PAAMAYIM_NEKUDOTAYIM.但是,使用临时变量会产生预期的结果:
$class = Foo::$class;
$class::sayHello(); // Hello World
Run Code Online (Sandbox Code Playgroud)
有没有人知道这是设计的,还是范围分辨算子如何被标记化的意外结果?任何更清洁的解决方法比后者,临时变量示例?
php ×7
acl ×1
autocomplete ×1
c# ×1
callback ×1
class ×1
closures ×1
constraints ×1
definition ×1
html ×1
jquery ×1
methods ×1
model ×1
netbeans ×1
permissions ×1
scope ×1
tags ×1
xhtml2 ×1