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[""];
}
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
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
class myclass extends SimpleXMLElement {
public static function getInstance[$xmlversion = '1.0', $xmlencoding = 'ISO-8859-1', $rootName='root'] {
return new self[""];
}
}
Đã 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
Huy hiệu vàng 20K1379 Huy hiệu bạc121 Huy hiệu đồngMar 23, 2018 at 0:40
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