我希望能够通过使用构造函数而不是某些工厂方法来使用对象的透明(穷人)缓存。
$a = new aClass();应该检查该对象是否存在于缓存中,如果不存在,则创建它并将其添加到缓存中。
一些伪代码:
class aClass {
public function __construct($someId) {
if (is_cached($someId) {
$this = get_cached($someId);
} else {
// do stuff here
set_cached($someId, $this);
}
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这是不可能的,因为你不能$this在 php 中重新定义。
有什么建议么?
我正在编写一个程序,可以在其中从可用对象列表中进行选择Sensor;在选择和用户验证后,程序应实例化该Sensor.
下面的代码片段是我可能会天真地做的事情:
switch userInput
case 'Sensor A'
s = SensorA; % subclass of Sensor
case 'Sensor B'
s = SensorB; % subclass of Sensor
%...
end
Run Code Online (Sandbox Code Playgroud)
这里有一些明显的问题,但我遇到的最大问题是使其可扩展。我希望能够创建许多不同的Sensor子类(或让其他开发人员生成Sensor子类),而不必不断添加到此switch语句中。更一般地说,我想坚持开放/封闭原则。我应该能够有很多不同的Sensor子类。(我也想用uicontrol可用的内容填充弹出菜单Sensors,但是如果这个问题得到普遍解决,这可能会得到解决。)其他简单的解决方案,例如查看充满Sensor子类的文件夹也不能很好地工作,因为对象构造可能是每个子类都不同。
我相信我正在寻找使用工厂方法模式,但我不完全确定如何实现它。我可以将上面的代码片段放入一个单独的 中SensorFactory,但这只是移动了switch语句,这意味着扩展它需要修改它。
如何正确实现工厂方法模式,以便每次添加新子类时不需要修改工厂对象Sensor?
我需要将对类构造函数的引用存储在变量中,并稍后构造该对象。这是我的最小代码示例:
function A() {
var _foo = "A";
}
function Wrapper( constructorFunc ) {
var _constructorFunc = constructorFunc;
this.constructorFunc = function() {
return _constructorFunc;
}
}
var wrapper = new Wrapper( A.constructor );
var cFunc = wrapper.constructorFunc();
var obj = new cFunc(); /* obj should be an A now */
Run Code Online (Sandbox Code Playgroud)
我希望我想做什么很清楚。Firebug 控制台给出错误TypeError: cFunc is not a constructor。正确的方法是什么?
此外,我必须能够“比较”构造函数,即我需要知道两个引用是否指向同一个构造函数。(在 C++ 中这是可能的,因为比较函数的地址。)举个例子:
function A() {
var _foo = "A";
}
function B() {
var _bar = "B";
}
function Wrapper( …Run Code Online (Sandbox Code Playgroud) 我有一个抽象超类,带有一个返回子类实例的工厂。是否有可能有一个仅在超类中实现的方法?例如,在下面的代码中,是否可以删除 Wind::act()?
abstract class Element {
final String action; // what it does
String act() => action; // do it
factory Element() {
return new Wind();
}
}
class Wind implements Element {
final action = "blows";
act() => action; // Why is this necessary?
}
void main() {
print(new Element().act());
}
Run Code Online (Sandbox Code Playgroud)
删除 Wind::act() 时,出现缺少它的错误。此外,当扩展而不是实现超类时,省略子类实现不会导致错误。但对于工厂方法,扩展不是一种选择。
我在尝试使用静态构造函数通过以下工厂注册我的类型时遇到问题:
public class Factory<T>
{
public static Factory<T> Instance { get { return _instance; } }
private static Factory<T> _instance = new Factory<T>();
private Factory() { }
static Factory() { }
static Dictionary<string, Type> _registeredType = new Dictionary<string, Type>();
public void Register(string id, T obj)
{
if (obj.GetType().IsAbstract || obj.GetType().IsInterface)
throw new ArgumentException("Cannot create instance of interface or abstract class");
_registeredType.Add(id, obj.GetType());
}
public T Create(string id, params object[] parameters)
{
Type type;
if(!_registeredType.TryGetValue(id, out type))
throw new UnsupportedShapeException(id);
return …Run Code Online (Sandbox Code Playgroud) Symfony 文档没有给出Symfony 中工厂使用的完整示例。
就我而言,我有许多不同的服务,可以生成不同的水果 API:
每个服务都有自己的依赖项,依赖项是一些绑定参数:
services:
_defaults:
autowire: true
bind:
$guzzleClientBanana: '@eight_points_guzzle.client.banana'
$guzzleClientApple: '@eight_points_guzzle.client.apple'
...
Run Code Online (Sandbox Code Playgroud)
服务举例:
# BananaApiService.php
class BananaApiService extends DefaultEndpointService
{
protected $guzzleClientBanana;
public function __construct(GuzzleClient $guzzleClientBanana)
{
$this->guzzleClientBanana = $guzzleClientBanana;
}
public function handleRequest(ApiRequest $apiRequest)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
目前我没有使用工厂模式,而是将所有服务传递给管理器的构造函数,这太脏了并且不符合最佳实践:
# ApisManagerService
class ApisManagerService
{
protected $BananaApiService;
protected $AppleApiService;
protected $PearApiService;
public function __construct(BananaApiService $BananaApiService,
AppleApiService $AppleApiService,
PearApiService $PearApiService)
{
$this->BananaApiService = $BananaApiService;
//...
}
public function requestDispatcher(ShoppingList $shoppingList): void …Run Code Online (Sandbox Code Playgroud) 我正在关注一个 Youtube 教程全功能 Web 应用程序,但我遇到了应用程序工厂的问题。根据我的理解,我需要将SECRET_KEY和SQLALCHEMY_DATABASE_URI等敏感信息放入环境变量中。在视频中,创建者在 Mac 上工作,他打开了他的 .bash_profile 文件并添加了这些行(我将实际值留空):
export SECRET_KEY='....'
export SQLALCHEMY_DATABASE_URI='......'
Run Code Online (Sandbox Code Playgroud)
我正在使用 Windows,但在我的计算机中找不到 .bash_profile 文件,所以我转到控制面板并设置新的环境变量 SECRET_KEY 和 SQLALCHEMY_DATABASE_URI。然后我按照视频中的步骤在 config.py 中创建此类 Config
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY')
SQLALCHEMY_DATABASE_URI = os.environ.get('SQLALCHEMY_DATABASE_URI')
MAIL_SERVER = 'smtp.gmail.com'
MAIL_PORT = 587
MAIL_USE_TLS = True
MAIL_USERNAME = os.environ.get('EMAIL_USER')
MAIL_PASSWORD = os.environ.get('EMAIL_PASSWORD')
Run Code Online (Sandbox Code Playgroud)
然后我运行了我的应用程序,但是出现了一条错误消息“使用CSRF需要一个秘密密钥。”,所以我认为我的flask应用程序无法获取我设置的SECRET_KEY或其他环境变量。在我的init .py 中有这些配置之前,应用程序运行良好,但现在当我将这些配置移动到 config.py 中的对象内部时,它停止工作。
根据我的理解,export是一个创建环境变量的命令,所以我认为在 .bash_profile 文件中导出这些变量等于设置环境变量。
为了解决我的问题,我尝试按照教程(https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xv-a-better-application-structure)创建 .env 文件。在命令提示符下,我跑了
pip install python-dotenv
Run Code Online (Sandbox Code Playgroud)
在 Config.py 中,我添加了
from dotenv import load_dotenv
basedir = os.path.abspath(os.path.dirname(__file__))
load_dotenv(os.path.join(basedir, '.env'))
Run Code Online (Sandbox Code Playgroud)
我认为这会创建一个 .env 文件,我可以在其中存储我的环境变量,但它什么也没做,我在我的目录中没有看到任何 …
1- 用户表,使 id uuid 类型。
没问题
php artisan migrate:refresh
Run Code Online (Sandbox Code Playgroud)
但是这个错误
php artisan db:seed
Run Code Online (Sandbox Code Playgroud)
错误:(“SQLSTATE[HY000]:一般错误:1364 字段‘id’没有默认值”)
2- 公司也希望随机分配给用户。在用户表中,uuid 类型将保存在 user_id 列中。
谢谢你从现在...
用户模型:
use UsesUuid;
protected $fillable = ['name', 'email', 'password', 'role', 'slug',];
protected $hidden = ['password', 'remember_token',];
protected $casts = ['email_verified_at' => 'datetime',];
public function companies()
{
return $this->hasMany('App\Company', 'user_id', 'id');
}
Run Code Online (Sandbox Code Playgroud)
使用 Uuid 特性:
protected static function boot()
{
parent::boot();
static::creating(function ($post) {
$post->{$post->getKeyName()} = (string)Str::uuid();
});
}
public $incrementing = false;
public function getKeyType()
{
return 'string';
} …Run Code Online (Sandbox Code Playgroud) 我正在使用 Wordpress,需要实例化一个类似于这个过于简化的示例的新类(对于add_action()接收一些参数的钩子):
class A {
public function __construct() {
}
public static function init() {
$instance = new self();
$instance->doStuff();
}
protected function doStuff() {
echo get_class($this);
}
}
class B extends A {
}
B::init(); //returns 'A'
Run Code Online (Sandbox Code Playgroud)
当扩展类调用时,我如何才能self引用init()它们?我知道PHP 文档中的最新静态绑定页面,但我不清楚如何在上述上下文中应用它。谢谢!
这些对我来说都很好:
示例 1:
Character newCharacter = 'c';
Run Code Online (Sandbox Code Playgroud)
示例 2:
Character newCharacterOther = new Character('c');
Run Code Online (Sandbox Code Playgroud)
但有什么区别呢?
在第一个示例中,Character 类如何知道将其值设置为“c”而不需要构造函数?
它是否在幕后使用工厂方法?有人可以向我解释编译器如何知道要做什么吗?
我在java.lang 中提供了Character.class 的构造函数的图像。
它甚至说它已被弃用,不应该像那样访问它,但我仍然有点困惑。