کلاس جدید Dom\HTMLDocument در PHP 8.4
خلاصهٔ کاملتر
لیام همت میگه با انتشار PHP 8.4 یه کلاس جدید بهاسم Dom\HTMLDocument داریم که کار با اسناد HTML رو سادهتر و استانداردمحورتر میکنه و در ضمن چند باگ دیرینهٔ کلاس قدیمی DOMDocument رو رفع میکنه. بیشتر interfaceها شبیهان: هنوز میتونی saveHTML صدا بزنی، getElementById یا getElementsByTagName داری، و مفاهیم node/element/node list هنوز مثل قبل رفتار میکنن. ولی به گفتهٔ نویسنده کلاسهای جدید Dom* جایگزین drop-in و backward-compatible کلاسهای قدیمی نیستن؛ interface مشابه ولی در نهایت متفاوتی دارن. برای همین PHP 8.4 اینها رو تو namespace جدید Dom گذاشته و کلاسهای قدیمی تو namespace سراسری با رفتار قدیمشون میمونن.
یکی از تفاوتها ساخت سند ئه: کلاس جدید با متدهای سازندهٔ استاتیک ساخته میشه، مثل Dom\HTMLDocument::createFromString($html)، createFromFile($path) و createEmpty() بهجای new DOMDocument() و بعد loadHTML().
نویسنده به رفتار ضمنی متفاوت هم اشاره میکنه. چون کلاس جدید یه parser بنیادی متفاوت برای HTML استفاده میکنه، رفتار تازه میبینی: کلاس قدیمی بیصدا یه doctype ضمنی اضافه میکرد و تگ و دور محتوا میذاشت، ولی کلاس جدید doctype اضافه نمیکنه (بهجاش یه warning دربارهٔ نبود doctype میده) و علاوه بر و ، یه خالی هم اضافه میکنه. این رفتار ضمنی رو تو هر دو میشه با فلگ LIBXML_HTML_NOIMPLIED خاموش کرد.
یه بهبود بزرگ کوئری با سلکتورهای CSS ئه. به گفتهٔ نویسنده کلاسهای قدیمی راهی برای کوئری مستقیم با CSS نداشتن و آدمها اغلب از پکیجی مثل symfony/css-selector استفاده میکردن تا CSS رو به XPath تبدیل کنن. کلاس جدید متدهای querySelector و querySelectorAll بومی داره، پس کل اون تبدیل حذف میشه. برای انتقال node از سند قدیمی به جدید هم یه helper بهاسم importLegacyNode هست، چون importNode فقط Dom\Node میپذیره و اگه DOMElement قدیمی بهش بدی TypeError میده.
از نظر پرفورمنس، نویسنده میگه کلاس جدید بیرون از جعبه سریعتر و کممصرفتره؛ تو یه بنچمارک ساده، Dom\HTMLDocument روی یک میلیون تکرار حدود ۳.۴ ثانیه در مقابل ۴.۳ ثانیهٔ کلاس قدیمی بود. یه هشدار هم میده: فعلاً مستندات رسمی پر از کامنت «هنوز مستند نشده» ئه و جزئیات زیادی جا مونده، ولی JetBrains یه فایل stubs برای PHPStorm منتشر کرده تا متدها و signatureها رو ببینی. نویسنده جمعبندی میکنه که این کلاس یه افزودهٔ خوشآمد به PHP 8.4 ئه: interface سادهتر برای کارهای رایج، مدیریت بهتر HTML و پرفورمنس بالاتر.
نکات کلیدی:
- Dom\HTMLDocument استانداردمحورتره و باگهای قدیمی DOMDocument رو رفع میکنه
- backward-compatible نیست؛ تو namespace جدید Dom میمونه و کلاسهای قدیمی دستنخورده
- querySelector و querySelectorAll بومی، نیاز به symfony/css-selector رو حذف میکنن
- سازندههای استاتیک، رفتار پارس متفاوت، و پرفورمنس بهتر از ویژگیهای اصلیان




