可能重复:
在PHP5类中,何时调用私有构造函数?
我最近一直在阅读有关OOP的内容并遇到了这个私有构造函数的情况.我做了Google搜索,但找不到与PHP相关的任何内容.
在PHP中
我已经尝试过几次了解Singleton是什么.也许我只是太过视觉化......所以任何人都可以用一个简单的比喻来分解它.
类似帖子:
我正在审查log4net的一些代码,我遇到了这个.
private static readonly ILog logger = LogManager.GetLogger(typeof(AdminClient));
Run Code Online (Sandbox Code Playgroud)
我想知道为什么你需要私有静态只读.
从我的理解私有意味着变量不能在类外使用,除非有一个访问器方法或获取属性.
static意味着变量仅在此文件中作用域.
readonly意味着您只能从值中读取并且无法分配它.
所以,我在想那个编写这段代码的人.声明它是私有的,因为他们不希望它在类外使用和静态,因此不希望它在文件外部使用.但是,如果有一个get属性会静态阻止这种形式发生.
我想我只能理解readonly,而且只能读取和设置值.
非常感谢任何建议,
当我第一次看到反单身评论时,我很困惑.我在最近的一些项目中使用了单例模式,并且它运行得很漂亮.事实上,我已经使用了很多次.
现在,在遇到一些问题之后,阅读这个问题,尤其是这篇博文,我理解了我带给世界的邪恶.
那么:我如何从现有代码中删除单例?
例如:
在零售店管理程序中,我使用了MVC模式.我的Model对象描述了商店,用户界面是View,我有一组控制器,它们充当两者之间的联络.大.除了我将Store变成一个单独的(因为应用程序一次只管理一个商店),我还把我的大部分Controller类变成了单例(一个mainWindow,一个menuBar,一个productEditor ......).现在,我的大多数Controller类都可以像这样访问其他单例:
Store managedStore = Store::getInstance();
managedStore.doSomething();
managedStore.doSomethingElse();
//etc.
Run Code Online (Sandbox Code Playgroud)
我应该改为:
Globals仍然很糟糕,但至少他们不会假装.
我看到#1迅速导致可怕的膨胀构造函数调用:
someVar = SomeControllerClass(managedStore, menuBar, editor, sasquatch, ...)
Run Code Online (Sandbox Code Playgroud)
还有其他人经历过这个吗?如果不是全局变量或单个变量,那么为多个单独的类访问公共变量的OO方法是什么?
我有一个简单的应用程序,说它有一些类和一个处理数据库请求的"额外".目前我每次使用应用程序时都会创建数据库对象,但在某些情况下,不需要数据库连接.我这样做(PHP顺便说一句):
$db = new Database();
$foo = new Foo($db); // passing the db
Run Code Online (Sandbox Code Playgroud)
但有时该$foo对象不需要db访问,因为只调用没有数据库操作的方法.所以我的问题是:处理这种情况的专业方法是什么/如何仅在需要时创建数据库连接/对象?
我的目标是避免不必要的数据库连接.
我的目标是在我正在进行的C++游戏中使用全局常量(表示一些图形信息等).我目前的实现是将它们全部放在.h中并将它们包含在各处.这是有效的,除了每次更改设置时,必须重新编译整个代码库.
所以,我的下一个想法是将它们放在一些配置txt文件中并解析它们,这样在设置更改时实际上没有代码被更改.解析器很简单,我可以将值放入常量中,但由于解析器是一个代码块,因此常量不再是全局的.
有没有好办法解决这个问题?也许有些方法可以让它们成为全局,尽管它们处于阻塞或某种方式以避免在更改设置时重新编译所有内容?
就在前几天,我看到了使用所谓的单例模式的代码.意思是某些东西
class MySingleton{
public:
void foo() { ... }
static MySingleton&get_instance(){
static MySingleton singleton;
return singleton
}
private:
MySingleton(){ ... }
~MySingleton(){ ... }
int bar;
};
Run Code Online (Sandbox Code Playgroud)
我确实想知道为什么会这样做:
但是,我不明白为什么这种做事方式优于一些免费功能.我实施它的方式是放
namespace some_name{
void foo();
}
Run Code Online (Sandbox Code Playgroud)
在标题和
namespace some_name{
void foo(){
...
}
}
Run Code Online (Sandbox Code Playgroud)
在实现文件中.如果我需要初始化和/或清理,我要么添加一些必须显式调用或添加的函数
namespace{
class Dummy{
Dummy(){ ... }
~Dummy(){ ... }
}dummy;
}
Run Code Online (Sandbox Code Playgroud)
进入实施文件.
我知道这是从语义的角度来看单例,但是我看到第一个变体在C++代码中使用得比第二个更常见.为什么?我认为第二个版本略胜一筹,所以我问自己是否遗漏了一些明显的东西.
你能解释一下为什么每个人都使用第一个变种吗?我没有看到在C语言中做旧事情的单一优势.
在阅读sbi和Eli Bendersky在这个问题中的答案后,我开始想知道静态成员函数的用途.
一个类的朋友免费功能应该不能做任何静态成员函数可以做的事情?如果是这样,为什么/何时我应该更喜欢静态成员函数给朋友免费?
关于构造函数在PHP中如何工作,我有点困惑.
我有一个带有构造函数的类,当我实例化一个新对象时会调用它.
$foo = new Foo($args);
Run Code Online (Sandbox Code Playgroud)
__construct($params)在类中调用Foo它并执行适当的初始化代码.
但是,当我使用该类调用静态函数时,将再次调用构造函数.
$bar = Foo::some_function(); //runs the constructor from Foo
Run Code Online (Sandbox Code Playgroud)
这会导致构造函数执行,运行我打算仅在创建新Foo对象时使用的对象初始化代码.
我是否忽略了构造函数的工作原理?或者有什么方法可以防止__construct()在我使用类进行静态函数调用时执行?
我应该使用"工厂"功能来进行对象初始化吗?如果是这样,构造函数的重点是什么呢?
::编辑::我有一个表单,用户可以将照片上传到相册(create_photo.php)和他们可以查看相册的区域(view_photos.php).提交表格时:
$photo = new Photo($_FILES['photo'], $_POST['arg1'], ect..);
Run Code Online (Sandbox Code Playgroud)
Photo构造函数创建并保存照片.但是在view_photo.php中,当我打电话时:
$photo = Photo::find_by_id($_POST['id']) //user-defined function to query database
Run Code Online (Sandbox Code Playgroud)
这导致Photo的构造函数运行!