小编yiv*_*ivi的帖子

如何让PHP类构造函数调用其父级的父构造函数

我需要在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友好的,但这不是问题的问题.

对于以后遇到此问题的任何人 - 请找到另一种解决方案.我能够找到一种更好的方法,不会对类结构造成严重破坏.你也应该这样.

php oop inheritance constructor class

194
推荐指数
10
解决办法
22万
查看次数

PHP中的self :: $ bar和static :: $ bar有什么区别?

可能重复:
新自我与新静态

使用selfstatic下面的例子有什么区别?

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)

php oop php-5.3

112
推荐指数
5
解决办法
5万
查看次数

什么是PHP中的抽象类?

什么是PHP中的抽象类?哪里可以使用?

php oop abstract-class

110
推荐指数
5
解决办法
10万
查看次数

如何降级或安装特定版本的 Composer?

我正在设置的项目中出现以下错误:

您正在使用 Composer 2,您的某些插件似乎与之不兼容。确保您更新插件或报告插件问题以要求他们支持 Composer 2。

我本周开始在一家新公司工作,只是试图安装他们的项目,但似乎没有办法在 Windows 上更改我的作曲家版本。我宁愿不更新他们的所有软件包,因为我还不熟悉这些项目,也不知道其中有什么样的影响。

php windows composer-php

79
推荐指数
4
解决办法
8万
查看次数

Angular 的“CanActivate”接口已弃用。如何更换?

我的 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

74
推荐指数
3
解决办法
7万
查看次数

PHP - 是否可以声明静态和非静态方法

我可以将对象中的方法声明为静态和非静态方法,并且具有调用静态方法的相同名称吗?

我想创建一个具有静态方法"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)

可能吗?

php oop

65
推荐指数
1
解决办法
2万
查看次数

为什么我在引入属性类型提示时突然收到“在初始化之前不能访问类型化属性”错误?

我已经更新了我的类定义以使用新引入的属性类型提示,如下所示:

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)

php type-hinting doctrine-orm php-7 php-7.4

62
推荐指数
2
解决办法
5万
查看次数

了解IoC容器和依赖注入

快进:

我写这篇文章的目的是为了更好地理解依赖注入和IoC容器,以及之后我可以纠正它中的错误并用它来帮助教我的一些朋友关于它们.

截至目前,我已经尝试阅读各种框架(laravel,fuel,codeigniter,symfony)的文档,我发现框架中有太多不同的方面,我需要感觉舒服使用它,我决定尝试在尝试在框架中使用它们之前,先单独学习每个主要部分.

我花了几个小时搜索各种含义,查看stackoverflow响应,阅读各种文章试图了解什么是IoC以及如何使用它来正确管理依赖关系,我相信我理解它在概念中是什么,但我仍然是灰色的关于如何正确实现它.我认为阅读本文的任何人帮助我的最好方法是给出我目前对IoC容器和依赖注入的理解,然后让那些比我更了解的人指出我的理解不足的地方.

我的理解:

  • 依赖性是指ClassA的实例需要ClassB的实例来实例化ClassA的新实例.
  • 依赖注入是指ClassA通过ClassA的构造函数中的参数或通过set~DependencyNameHere~(~DependencyNameHere~ $ param)函数传递ClassB的实例.(这是我不完全确定的领域之一).
  • IoC容器是单例类(在任何给定时间只能实例化1个实例),其中可以注册实例化该项目的那些类的对象的特定方式.这里是我正在尝试描述的示例的链接以及我一直在使用的IoC容器的类定义

所以在这一点上,我开始尝试使用IoC容器来处理更复杂的场景.到目前为止,为了使用IoC容器,我似乎只限于我想要创建的任何类的has-a关系,它具有它想要在IoC容器中定义的依赖项.如果我想创建一个继承类的类,但只有在以IoC容器中注册的特定方式创建父类时,该怎么办?

例如:我想创建一个mysqli的子类,但是我想在IoC容器中注册这个类,只是实例化我以前在IoC容器中注册的方式构造的父类.在没有重复代码的情况下,我无法想到这样做的方法(因为这是一个学习项目,我试图尽可能保持'纯').这里有一些我想要描述的例子.

以下是我的一些问题:

  • 在不违反OOP原则的情况下,我正在努力做到这一点吗?我知道在c ++中我可以使用动态内存和复制构造函数来完成它,但我还没能在php中找到那种功能.(我承认除了__construct之外我没有使用任何其他魔术方法的经验,但是如果我理解正确的话,从阅读和__clone,我不能在构造函数中使用它来使子类被实例化为一个克隆父类的实例).
  • 我的所有依赖类定义应该与IoC相关联?(我的IoC.php应该在顶部有一堆require_once('dependencyClassDefinition.php')吗?我的直觉反应是有更好的方法,但我还没想出一个)
  • 我应该在哪个文件中注册我的对象?目前在类定义之后对IoC.php文件中的IoC :: register()进行所有调用.
  • 在注册需要依赖的类之前,是否需要在IoC中注册依赖项?因为我没有调用匿名函数,直到我实际实例化在IoC中注册的对象,我猜不是,但它仍然是一个问题.
  • 还有什么我忽略了我应该做或正在使用的东西吗?我试图一步一步,但我也不想知道我的代码是可重用的,最重要的是,对我的项目一无所知的人可以阅读并理解它.

我知道这是非常漫长的,只是想提前感谢任何花时间阅读它的人,甚至更愿意分享他们的知识.

php oop inheritance dependency-injection inversion-of-control

60
推荐指数
1
解决办法
2万
查看次数

原始 brew update 错误需要运行 git fetch --unshallow,但又出现了另一个 git 致命错误

$ 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)

任何人都可以帮忙吗?

homebrew

46
推荐指数
2
解决办法
6295
查看次数

多种返回类型php 7

我有一些方法可以返回两种返回类型之一 - (我正在使用一个利用MCV的框架,所以特别重构这几个函数并不吸引人)

是否可以声明返回类型返回一个或另一个并失败的其他任何东西?

function test(): ?
{
    if ($this->condition === false) {
        return FailObject;
    }

    return SucceedObject;
}
Run Code Online (Sandbox Code Playgroud)

php type-hinting php-7

39
推荐指数
4
解决办法
3万
查看次数