Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:119591 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 64288 invoked from network); 21 Feb 2023 18:00:02 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 21 Feb 2023 18:00:02 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id CF3021804B1 for ; Tue, 21 Feb 2023 10:00:01 -0800 (PST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=-1.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,MISSING_HEADERS, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.2 X-Spam-ASN: AS15169 209.85.128.0/17 X-Spam-Virus: No X-Envelope-From: Received: from mail-qt1-f173.google.com (mail-qt1-f173.google.com [209.85.160.173]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Tue, 21 Feb 2023 09:59:58 -0800 (PST) Received: by mail-qt1-f173.google.com with SMTP id v19so5103259qtx.1 for ; Tue, 21 Feb 2023 09:59:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=JzFGrjVUNgYTUZSRoi0Yu60tbc52rSd9OUfOy38JANU=; b=K83W1GtP5tBiHvfvx1vSgv0IFbnI2my8R6sbA8+1VC6xoPzh4BX8kvlQoW8ERpD1IU nrbPayo8sSaLRDqTdNK+1qIC8AegJgfkc/NB/i2w34KbyunYlOKRW6reofbvZGBFGBvZ YUL1vOf1ICTC4RbdSv8oRjs8OWgOwCydbIgsRaIS8Iy2Ha22UEatcd7c/4XSbcLm4YUu T4qmf2si6dcLGfJio+h+ecYttq2IU6r9S3itaZkmdr9Bcpu+f+qo2YqMQT66hySbRnIX L2kQoYSbzwhjTJF9CWsQrQCXI64dsU5EBQYsTj1tEo9yAY+rD8jr59sWtFK1wq638tWJ 3cmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=JzFGrjVUNgYTUZSRoi0Yu60tbc52rSd9OUfOy38JANU=; b=e1wsNgE/NyBV+KiWISjltYrUV9wNXHplAa/yf2a8Soi94Muoeg6muzqDtHkT55p8sw 6liQaZRO8mBz3m2kKAjW3WVYXzzJCeVvAtpz2vI6VQke/tLZsWmJWQ2v/1uZb8WwF9Wx vRQaVRLRMT6dEx4cKB0OT1o0MBk7kHwSvsqRP8EYF/pwV+iDrB1aJqZwqKL5p8HzrqLL hNn5EBkPJQUAwS8PU2KjE2mJsIjJ2/vYL5yfpUqzi818EJ525+J3p/z/5ApFezyVKXPB OyyqnFTRA7yOJy21vzVVmuBQap9xXrjV3i+APIymrh4JoPC3HWHjObWmkNfn0QIIGZPE tDVg== X-Gm-Message-State: AO0yUKWyp1iewr1K1YG/fuZ1K4hsdC25lhN8VXEySc7XB7s1yZDR5GoO 7lSHXcEnx1hnI/VYoqs28qsMnn6QDWANPQ8qR+k94b8bEwM= X-Google-Smtp-Source: AK7set9mLfq/ryT5UhznAxLFyvEbMGTJMCH4e4nO/JL8jnOpkYUPcFi7awy/3gY3Xd7/xn3r7YeE6HEiJRZsk3v4ZMs= X-Received: by 2002:ac8:405b:0:b0:3bd:142a:cb21 with SMTP id j27-20020ac8405b000000b003bd142acb21mr622513qtl.0.1677002397464; Tue, 21 Feb 2023 09:59:57 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: Date: Tue, 21 Feb 2023 13:59:30 -0400 Message-ID: Cc: php internals Content-Type: text/plain; charset="UTF-8" Subject: Re: [PHP-DEV] Class Re-implementation Mechanism From: weirdan@gmail.com (Bruce Weirdan) On Tue, Feb 21, 2023 at 7:53 AM someniatko wrote: > We want to write some tests for the Service class, but we don't want > to use a real SomeDependency instance > during tests. A common approach is to either extract an interface > (JUST to make it testable), or to drop the > `final` keyword and allow extending the class. > > Both approaches have their flaws: > - extracting an interface unnecessarily complicates the system, where > only one "real" implementation of an interface is assumed. > - dropping the `final` keyword allows for the rabbit-hole of > inheritance abuse, like greatly described in this article: > https://front-line-php.com/object-oriented There's another approach that requires neither: removing `final` during class loading, for tests only. See https://github.com/dg/bypass-finals (and https://github.com/nunomaduro/mock-final-classes for plug'n'play integration with PHPUnit).