我是新手,所以请耐心等待.我最近在几个项目中使用过一个MVC框架,过了一段时间,我对MVC中"模型"的感知功能感到失望.
我得到了控制器和视图的有用性,我知道表示和逻辑之间的分离对于使代码在未来更易于维护是很重要的,尽管不一定更快或更强大.
如果首先将所有逻辑放在控制器内部,我看不到Model的任何用途,尤其是Active-Record.我们已经有了一种非常强大且易于使用的语言来与数据库进行通信,对吗?它叫做SQL.对于我来说,当实现模型像活动记录时,它的用处取决于您是否希望您的应用程序适合多个数据库.
所以我要问的是,如果你只使用一个数据库,为什么还要使用模型和Active-Records呢?为什么不只使用SQL?为什么额外的复杂层?你们有没有任何案例研究/现实生活中的故事,其中模型实际上可以比仅使用数据库类和SQL-away更好地做事情?
再一次,如果我似乎如此无知,我很抱歉,但我真的不知道为什么模型很重要.谢谢回答.
RFC 3986声明新的URI方案应该在编码百分比之前首先编码为UTF-8.但是,这不适用于以前的URI版本.
是否可以安全地假设所有多字节,百分比编码的URI在传递之后变成UTF-8编码的字符串urldecode()?
例如,如果内容的$_SERVER['REQUEST_URI']百分比编码为:
/b%C3%BCch/w%C3%B6rterb%C3%BCch
Run Code Online (Sandbox Code Playgroud)
我将此字符串传递给后urldecode(),我应该有一个多字节字符串.但是我怎么知道字符串的编码是什么?在上面的例子中,它是UTF-8,但总是这样安全吗?
如果假设这样做是不安全的,有没有办法(除了mb_detect_encoding)检测字符串的编码?我已经检查了请求标头,它们似乎没有任何帮助.
当转换通过像DependencyFinder和java-callgraph这样的库生成的java调用图时,我发现java编译器为匿名函数,内部类等生成名称.
我已经找到了其中几个的含义(如果我错了,请纠正):
org.example.Bar$Foo指的是Foo,这是一个内在的类org.example.Bar.org.example.Bar$1指的是在其中一个方法中声明的匿名类org.example.Bar.org.example.Bar.lambda$spam$1()指的是在org.example.Bar.spam()方法内声明的lambda .但是,我也发现:
org.example.Bar$$Lambda$2.args$1org.example.Bar$$Lambda$2.call()org.example.Bar$$Lambda$7.lambdaFactory$()org.example.Bar$$Lambda$7.get$Lambda()上面的四个名字是指什么?double dollar($$)是什么意思?
所以,这是交易.我设法在不使用全局变量或静态类/函数的情况下创建框架.
我正在使用一种使用Factory的依赖注入形式.由于框架将用于各种事情,我正在创建一个更通用的工厂,它将构建您的类,并以递归方式依赖它.
为了节省内存,每次对象被实例化时,Factory都会存储对它的引用,因此如果另一个对象具有对该对象的依赖关系,Factory将只需要返回引用.这样我们就不需要两次实例化同一个对象了.
这意味着,在许多类中,我们将对同一对象有许多不同的引用.例如,如果我声明Blog_model,Blog_controller,Blog_view,Form_validation需要Config对象,则每个实例都将使用对同一Config对象的引用进行实例化,尽管是注入.
我不熟悉单元测试或任何类型的自动测试.我刚刚发现使用全局变量和静态都很糟糕(这就是为什么我要重写我使用的框架).我想问的是,这会引入全球状态吗?它是否以任何方式妨碍测试?
----更新------
这是一个用PHP编写的MVC框架.
我想创建一个包装器Session,Request以便我不必直接访问PHP超级全局.我意识到如果我为超级全局创建一个包装器并使用它们,单元测试我的应用程序会更容易,因为包装类可以被模拟.
在尝试创建我的包装类时,我研究了一些示例包装类.其中一些在初始化时将超全局存储为类属性:
class Session
{
protected $vars;
public function __construct()
{
session_start();
// POINT OF INTEREST
// Store the superglobal as a class property
$this->vars = $_SESSION;
}
public function get($index)
{
// POINT OF INTEREST
// Accesses the class property instead of the superglobal
return $this->vars[$index];
}
public function write($index, $value)
{
// Writes both class property and session variable
$this->vars[$index] = $value;
$_SESSION[$index] = $value;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题:有没有什么特别的原因为什么在创建包装类时我们将超全局存储为类'属性而不是直接访问它们?将上述代码与此对比:
class Session
{
public function __construct() …Run Code Online (Sandbox Code Playgroud) php ×2
architecture ×1
factory ×1
globals ×1
http ×1
jar ×1
java ×1
javac ×1
lambda ×1
paradigms ×1
phpunit ×1
superglobals ×1
unit-testing ×1
uri ×1