我需要在PHP中使用类构造函数调用其父级的父级(祖父级?)构造函数而不调用父构造函数.
// main class that everything inherits
class Grandpa
{
public function __construct()
{
}
}
class Papa extends Grandpa
{
public function __construct()
{
// call Grandpa's constructor
parent::__construct();
}
}
class Kiddo extends Papa
{
public function __construct()
{
// THIS IS WHERE I NEED TO CALL GRANDPA'S
// CONSTRUCTOR AND NOT PAPA'S
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这是一件很奇怪的事情,我试图找到一种味道并不难闻的手段但是,我很好奇是否有可能.
编辑
我想我应该发布所选答案的理由.原因是; 它是最优雅的解决方案,希望在保留所有值的同时调用"祖父母"的构造函数.它当然不是最好的方法,也不是OOP友好的,但这不是问题的问题.
对于以后遇到此问题的任何人 - 请找到另一种解决方案.我能够找到一种更好的方法,不会对类结构造成严重破坏.你也应该这样.
可能重复:
新自我与新静态
使用self
和static
下面的例子有什么区别?
class Foo
{
protected static $bar = 1234;
public static function instance()
{
echo self::$bar;
echo "\n";
echo static::$bar;
}
}
Foo::instance();
Run Code Online (Sandbox Code Playgroud)
1234
1234
Run Code Online (Sandbox Code Playgroud) 我正在设置的项目中出现以下错误:
您正在使用 Composer 2,您的某些插件似乎与之不兼容。确保您更新插件或报告插件问题以要求他们支持 Composer 2。
我本周开始在一家新公司工作,只是试图安装他们的项目,但似乎没有办法在 Windows 上更改我的作曲家版本。我宁愿不更新他们的所有软件包,因为我还不熟悉这些项目,也不知道其中有什么样的影响。
我的 Angular 应用程序包含一个简单的应用程序,AuthGuard
如下所示,并且从未出现过问题。最近,我将 Angular 版本从 15.1.4 升级到 15.2.0,从那时起,我的 IDE 表明 和CanActivate
均已CanActivateChild
弃用。
Angular 的官方文档说CanActivate
:
已弃用:使用纯 JavaScript 函数代替。
我需要如何调整下面的代码以消除已弃用的警告?
export class AuthGuard implements CanActivate, CanActivateChild {
constructor(private authService: AuthenticationService) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
return this.authService.checkLogin()
.pipe(
map(() => true),
catchError(() => {
this.router.navigate(['route-to-fallback-page']);
return of(false);
}
)
);
}
canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | …
Run Code Online (Sandbox Code Playgroud) canactivate angular auth-guard canactivatechild candeactivate
我可以将对象中的方法声明为静态和非静态方法,并且具有调用静态方法的相同名称吗?
我想创建一个具有静态方法"send"的类和一个调用静态函数的非静态方法.例如:
class test {
private $text;
public static function instance() {
return new test();
}
public function setText($text) {
$this->text = $text;
return $this;
}
public function send() {
self::send($this->text);
}
public static function send($text) {
// send something
}
}
Run Code Online (Sandbox Code Playgroud)
我希望能够在这两个上调用函数
test::send("Hello World!");
Run Code Online (Sandbox Code Playgroud)
和
test::instance()->setText("Hello World")->send();
Run Code Online (Sandbox Code Playgroud)
可能吗?
我已经更新了我的类定义以使用新引入的属性类型提示,如下所示:
class Foo {
private int $id;
private ?string $val;
private DateTimeInterface $createdAt;
private ?DateTimeInterface $updatedAt;
public function __construct(int $id) {
$this->id = $id;
}
public function getId(): int { return $this->id; }
public function getVal(): ?string { return $this->val; }
public function getCreatedAt(): ?DateTimeInterface { return $this->createdAt; }
public function getUpdatedAt(): ?DateTimeInterface { return $this->updatedAt; }
public function setVal(?string $val) { $this->val = $val; }
public function setCreatedAt(DateTimeInterface $date) { $this->createdAt = $date; }
public function setUpdatedAt(DateTimeInterface $date) { …
Run Code Online (Sandbox Code Playgroud) 快进:
我写这篇文章的目的是为了更好地理解依赖注入和IoC容器,以及之后我可以纠正它中的错误并用它来帮助教我的一些朋友关于它们.
截至目前,我已经尝试阅读各种框架(laravel,fuel,codeigniter,symfony)的文档,我发现框架中有太多不同的方面,我需要感觉舒服使用它,我决定尝试在尝试在框架中使用它们之前,先单独学习每个主要部分.
我花了几个小时搜索各种含义,查看stackoverflow响应,阅读各种文章试图了解什么是IoC以及如何使用它来正确管理依赖关系,我相信我理解它在概念中是什么,但我仍然是灰色的关于如何正确实现它.我认为阅读本文的任何人帮助我的最好方法是给出我目前对IoC容器和依赖注入的理解,然后让那些比我更了解的人指出我的理解不足的地方.
我的理解:
所以在这一点上,我开始尝试使用IoC容器来处理更复杂的场景.到目前为止,为了使用IoC容器,我似乎只限于我想要创建的任何类的has-a关系,它具有它想要在IoC容器中定义的依赖项.如果我想创建一个继承类的类,但只有在以IoC容器中注册的特定方式创建父类时,该怎么办?
例如:我想创建一个mysqli的子类,但是我想在IoC容器中注册这个类,只是实例化我以前在IoC容器中注册的方式构造的父类.在没有重复代码的情况下,我无法想到这样做的方法(因为这是一个学习项目,我试图尽可能保持'纯').这里有一些我想要描述的例子.
以下是我的一些问题:
我知道这是非常漫长的,只是想提前感谢任何花时间阅读它的人,甚至更愿意分享他们的知识.
php oop inheritance dependency-injection inversion-of-control
$ brew update
Error: homebrew-core is a shallow clone. To `brew update` first run:
git -C "/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core" fetch --unshallow
Run Code Online (Sandbox Code Playgroud)
我试图运行上面的命令:git ... --unshallow
但我遇到了另一个错误:
fatal: dumb http transport does not support shallow capabilities
$ brew -v
Homebrew 2.6.0-104-g24f7898
Homebrew/homebrew-core (git revision b1ef15; last commit 2020-12-05)
Homebrew/homebrew-cask (git revision 443e7; last commit 2020-08-27)
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮忙吗?
我有一些方法可以返回两种返回类型之一 - (我正在使用一个利用MCV的框架,所以特别重构这几个函数并不吸引人)
是否可以声明返回类型返回一个或另一个并失败的其他任何东西?
function test(): ?
{
if ($this->condition === false) {
return FailObject;
}
return SucceedObject;
}
Run Code Online (Sandbox Code Playgroud) php ×8
oop ×5
inheritance ×2
php-7 ×2
type-hinting ×2
angular ×1
auth-guard ×1
canactivate ×1
class ×1
composer-php ×1
constructor ×1
doctrine-orm ×1
homebrew ×1
php-5.3 ×1
php-7.4 ×1
windows ×1