Hướng dẫn can a final class be extended php? - một lớp cuối cùng có thể được mở rộng php không?

Tôi muốn mở rộng lớp có hàm tạo cuối cùng (trong trường hợp của tôi là SimplexMlelement), nhưng tôi có vấn đề vì khi tôi sử dụng:

    class myclass extends SimpleXMLElement {
        function __construct($xmlVersion='1.0', $xmlEncoding='ISO-8859-1', $rootName='root'){
            parent::__construct("<$rootName />");
        }

Tôi nhận được lỗi:

Lỗi gây tử vong: Không thể ghi đè phương thức cuối cùng SimplexMlelement :: __ confruct ()

Khi tôi xóa trình xây dựng, tôi gặp lỗi này:

Lỗi gây tử vong: Ngoại lệ chưa được thực hiện 'Ngoại lệ' với thông báo 'SimplexMlelement :: __ Construct () mong đợi ít nhất 1 tham số, 0 được đưa ra'

Tôi bỏ lỡ một cái gì đó hoặc không hiểu cách gọi đúng nhà xây dựng cha mẹ là cuối cùng. Tôi không muốn các phương thức ghi đè chỉ mở rộng lớp, nhưng tôi không thể mở rộng vì nó yêu cầu __construct (). Vì vậy, tôi đã bỏ lỡ một cái gì đó và trở lại nơi bắt đầu.

Ai đó có thể giải thích nơi tôi đã sai?

Hỏi ngày 3 tháng 12 năm 2010 lúc 16:18Dec 3, 2010 at 16:18

Hướng dẫn can a final class be extended php? - một lớp cuối cùng có thể được mở rộng php không?

user9440008user9440008user9440008

55412 Huy hiệu bạc21 Huy hiệu đồng12 silver badges21 bronze badges

1

Tôi chỉ đã trải qua điều chính xác này. Bạn không cần phải mở rộng nó. Tạo một lớp giữ các đối tượng SimpLEXMLEuity. Tôi tin rằng đây là ý nghĩa của Nikola.

class XmlResultSet
{
    public $xmlObjs = array();

    public function __construct(array $xmlFiles)
    {
      foreach ($xmlFiles as $file) {
          $this->xmlObjs[] = new XmlResult($file);
      }
    }
}

class XmlResult
{
    private $xmlObj;

    public function __construct($file)
    {
        try {
            $this->xmlObj = new SimpleXMLElement($file, 0, true);
        }
        catch (Exception $e) {
            throw new MyException("Invalid argument ($this)($file)(" . $e .
            ")", PHP_ERRORS);
        }
    }

    public function otherFunctions()
    {
        return $this->xmlObj->movie['name']; // whatever
    }
}

Đã trả lời ngày 19 tháng 9 năm 2012 lúc 21:52Sep 19, 2012 at 21:52

Vcardillovcardillovcardillo

1.6363 huy hiệu vàng23 Huy hiệu bạc29 Huy hiệu đồng3 gold badges23 silver badges29 bronze badges

Tôi sẽ sử dụng thiết kế trình bao bọc đại biểu trong trường hợp này. Bạn nên xem xét thành phần thay vì kế thừa ở đây.

Philzen

3.64727 Huy hiệu bạc43 Huy hiệu đồng27 silver badges43 bronze badges

Đã trả lời ngày 3 tháng 12 năm 2010 lúc 16:33Dec 3, 2010 at 16:33

Hướng dẫn can a final class be extended php? - một lớp cuối cùng có thể được mở rộng php không?

class myclass extends SimpleXMLElement {
   public static function getInstance($xmlversion = '1.0', $xmlencoding = 'ISO-8859-1', $rootName='root') {
      return new self("<$rootName />");
   }
}

Đã trả lời ngày 3 tháng 12 năm 2010 lúc 16:27Dec 3, 2010 at 16:27

Thuốc nổ PillsexplosionExplosion Pills

186K50 Huy hiệu vàng320 Huy hiệu bạc396 Huy hiệu Đồng50 gold badges320 silver badges396 bronze badges

Vâng, final có nghĩa là cuối cùng. Không ghi đè phương thức. Ngay cả khi bạn hỏi độc đáo. Tôi đề nghị thêm một phương thức tạo () tĩnh vào lớp mới của bạn. Cái gì đó như:

class myclass extends SimpleXMLElement { 
    static function make($data, $xmlVersion='1.0', $xmlEncoding='ISO-8859-1', $rootName='root'){ 
        $obj=parent::__construct($data); 
        $obj->x=$xmlVersion;
        $obj->e=$xmlEncoding;
        $obj->r=$rootName;

        return $obj;
    } 
}

Đã trả lời ngày 3 tháng 12 năm 2010 lúc 16:27Dec 3, 2010 at 16:27

Thuốc nổ Pillsexplosiondnagirl

186K50 Huy hiệu vàng320 Huy hiệu bạc396 Huy hiệu Đồng13 gold badges79 silver badges121 bronze badges

Vâng, final có nghĩa là cuối cùng. Không ghi đè phương thức. Ngay cả khi bạn hỏi độc đáo. Tôi đề nghị thêm một phương thức tạo () tĩnh vào lớp mới của bạn. Cái gì đó như:

dnagirldnagirl

".$this->parentvar = 'set by '.get_class().'->parentconstruct' ); }
    function parentf() { echo( "\r\n
".get_class().'->parentf >> '.$this->parentvar ); } } /* * Extended class members. */ trait ChildC /* extends ParentC */ { function __construct() { // Call parent constructor. parent::__construct(); // Access an inherited property set by parent constructor. echo( "\r\n
".get_class().'->overridden_constructor >> '.$this->parentvar ); } function parentf() { // Call overridden parent method. parent::parentf(); // Access an inherited property set by constructor. echo( "\r\n
".get_class().'->overridden_parentf >> '.$this->parentvar ); } function dynamicf( $parm = null ) { // Populate a parent class property. $this->secondvar = empty( $parm ) ? 'set by '.get_class().'->dynamicf' : $parm; // Access an inherited property set by parent constructor. echo( "\r\n
".get_class().'->dynamicf >> '.$this->parentvar ); } } /* * Register the dynamic child class "ChildC", which is * derived by extending "ParentC" with members supplied as "ChildC" trait. */ $definition = new \Componere\Definition( 'ChildC', ParentC::class ); $definition->addTrait( 'ChildC' ); $definition->register(); /* * Instantiate the dynamic child class, * and access its own and inherited members. */ $dyno = new ChildC; $dyno->parentf(); $dyno->dynamicf( 'myvalue '); // Our object is also recognized as instance of parent! var_dump( $dyno instanceof ChildC, $dyno instanceof ParentC, is_a( $dyno, 'ParentC') ); var_dump( $dyno ); ?>

Huy hiệu vàng 20K1379 Huy hiệu bạc121 Huy hiệu đồngMar 23, 2018 at 0:40

Hướng dẫn can a final class be extended php? - một lớp cuối cùng có thể được mở rộng php không?

Có thể có những lý do hợp lệ để mở rộng lớp "cuối cùng" của bên thứ ba, dẫn đến mã dễ đọc/có thể duy trì hơn so với việc nhân đôi nó hoàn toàn hoặc tạo ra một số công việc phức tạp. Và chắc chắn tốt hơn là thay đổi mã nguồn của bên thứ ba và xóa từ khóa "cuối cùng".

PHP cung cấp phần mở rộng "Componere" để thực hiện một kỳ tích như vậy trong những trường hợp hiếm hoi đó thực sự là lựa chọn tốt nhất. Dưới đây là một ví dụ cho thấy cách một lớp con có thể được định nghĩa là "đặc điểm", sau đó có thể được sử dụng để mở rộng một cách tự động một lớp cha mẹ cuối cùng:Apr 25, 2014 at 15:03

Một lớp cuối cùng có thể được mở rộng?

Một lớp cuối cùng không thể mở rộng để tạo một lớp con.Tất cả các phương pháp trong một lớp cuối cùng là cuối cùng ngầm.Chuỗi lớp là một ví dụ về một lớp cuối cùng.Nếu bạn được phép tạo một lớp con của chuỗi, các đối tượng của lớp con đó có thể được sử dụng bất cứ nơi nào chuỗi s được mong đợi.. All methods in a final class are implicitly final . Class String is an example of a final class. If you were allowed to create a subclass of String , objects of that subclass could be used wherever String s are expected.

Một phương pháp cuối cùng có thể mở rộng các lớp khác?

Các lớp cuối cùng có thể mở rộng các lớp khác nhưng không thể được mở rộng từ.Bạn không thể khai báo một lớp kéo dài từ một lớp cuối cùng.Các lớp trừu tượng chỉ có thể được mở rộng bởi các lớp khác và không được sử dụng trực tiếp để tạo các đối tượng.. You cannot declare a class that extends from a final class. abstract classes can only be extended by other classes and not used directly to create objects.

Lớp cuối cùng có thể kế thừa PHP không?

Từ khóa cuối cùng được sử dụng để ngăn chặn một lớp được kế thừa và để ngăn phương pháp kế thừa bị ghi đè. and to prevent inherited method from being overridden.

Php lớp cuối cùng là gì?

Định nghĩa của lớp cuối cùng PHP.Php Final Class là một lớp ngăn chặn việc ghi đè một phương pháp của các lớp con chỉ bằng tiền tố cuối cùng với định nghĩa.Điều đó có nghĩa là nếu chúng ta xác định một phương thức với tiền tố cuối cùng thì nó sẽ ngăn chặn việc ghi đè phương thức.a class which prevents overriding a method of the child classes just by the final prefix with the definition. It means that if we are defining a method with the final prefix then it is going to prevent overriding the method.