我需要扩展一个项目.所有类都在单独的文件中,我需要扩展一些类而不重写其他文件中的现有代码.我的想法是使用命名空间,但我失败了.这是一个例子:
我已将原始的A.php类文件重命名为A_Original.php:
class A
{
public function hello()
{
echo "hello world from Class A\n";
}
}
Run Code Online (Sandbox Code Playgroud)
然后创建了一个新的A.php:
namespace AOriginal {
include 'A_Original.php';
}
namespace {
class A
{
public function hello()
{
echo "hello world from Class A Extended\n";
}
}
}
Run Code Online (Sandbox Code Playgroud)
这会失败,因为在including原始的A_Original.php文件中,类被转储到全局范围(因此忽略命名空间命令).我无法修改A_Original.php文件中的现有代码,但重命名是可以的.
其他项目文件(我无法修改)使用a require "A.php".
怎么做到这一点?
我知道如何写一个枚举属性作为字符串:
var
Form: TForm;
LContext: TRttiContext;
LType: TRttiType;
LProperty: TRttiProperty;
PropTypeInfo: PTypeInfo;
Value: TValue;
begin
Form := TForm.Create(NIL);
LContext := TRttiContext.Create;
LType := LContext.GetType(Form.ClassType);
for LProperty in LType.GetProperties do
if LProperty.Name = 'FormStyle' then
begin
PropTypeInfo := LProperty.PropertyType.Handle;
TValue.Make(GetEnumValue(PropTypeInfo, 'fsStayOnTop'), PropTypeInfo, Value);
LProperty.SetValue(Form, Value);
end;
writeln(Integer(Form.FormStyle)); // = 3
但如果我没有字符串但是整数(例如3表示fsStayOnTop)以及如何从该属性读取但不返回字符串(可以使用Value.AsString),如何设置值?
Value := LProperty.GetValue(Obj);
writeln(Value.AsString); // returns fsStayOnTop but I want not a string, I want an integer
writeln(Value.AsInteger); // fails
我正在寻找一个Delphi(10+)函数,它返回一个给定年份和周数的function StartDate(2021, 53): TDateTDate :
应返回2021-01-01.
尽管WeekOfTheYear(EncodeDate(2021,1,1))回报率53(正确的),我不能做其他方式轮StartOfAWeek(2021,53, 1)也不StartOfAWeek(2021,53, 5)(5 =这是一个星期五) -它不会被识别为有效日期(=除外).有什么建议?
编辑:我正在寻找符合ISO 8601标准的功能(如内部Delphi例程),星期一= 1和特殊周考虑(如2021-01-01),或者更精确:"反之亦然"例行程序 WeekOfTheYear