一応方針を定めましたので、ご意見があれば返信してください。
PHP9での動的プロパティ廃止に向けた対応として、**set/**getは使用せず、以下のように実装する予定です。
この方式により、既存ユーザーのコードを変更することなく、新規ユーザーには将来を見据えた実装方法を提供できます。
---
<?php
class BarcodeClass {
// 従来のユーザーのために、動的プロパティをそのまま利用可能にする
private array $properties = [];
// 新規ユーザー向けの推奨インターフェース
public function setProperty($name, $value) {
$this->$name = $value; // 内部的にも動的プロパティをそのまま使用
}
public function getProperty($name) {
return $this->$name ?? null;
}
}
// 使用例:
// 1. 従来通りの使い方(下位互換)
$obj->newProp = "値";
// 2. 新規の推奨される使い方
$obj->setProperty("newProp", "値");
---
この実装方針について、特に以下の点でご意見をいただければ幸いです:
1. 下位互換性の維持
2. PHP9(および移行期のPHP8.3)以降で利用できること
3. 本来の?__get および __set マジックメソッドを利用しなくてもよいか?
よろしくお願いいたします。
PHP5 〜 PHP9 に対応する手法として、次の両方を利用できるようにします。
旧: PHP5-PHP8.1(8.2-8.3)も可 / PHP8.3警告,PHP9エラー [動的プロパティ]
$barcode->dispStartStopCode = $dispStartStopCode;
新: PHP5-PHP9 全て可
$barcode->setProperty(Code39::PROP_DISP_START_STOP_CODE, $dispStartStopCode);
ーーーー
CODE39 のプロパティだけですが、ソースコードをお見せしておきます。次のようにコンストラクタで分け、入力するプロパティ名は定数とします。
class Code39 {
/** @var string 添字(バーコードの下の文字)を描画する・しない */
const PROP_TEXT_WRITE = 'TextWrite';
/** @var string 添字(バーコードの下の文字)のフォントファイル名 */
const PROP_FONT_NAME = 'FontName';
/** @var string 添字のフォントサイズ */
const PROP_FONT_SIZE = 'FontSize';
/** @var string スタート/ストップコード表示する・しない */
const PROP_DISP_START_STOP_CODE = 'dispStartStopCode';
/** @var string バー厚み */
const PROP_BAR_THICK = 'BarThick';
/** @var string 黒バーの太さ調整ドット数 */
const PROP_KURO_BAR_COUSEI = 'KuroBarCousei';
/** @var string スタート・ストップコードを含めたコード(テキスト) */
const PROP_OUTPUT_CODE = 'outputCode';
/*! 添字(バーコードの下の文字)を描画する・しない */
var $TextWrite = true;
/*! 添字(バーコードの下の文字)のフォントファイル名 */
var $FontName = "./font/mplus-1p-black.ttf";
/*! 添字のフォントサイズ */
var $FontSize = 10.0;
/*! スタート/ストップコード表示する・しない */
var $dispStartStopCode = true;
/*! バー厚み */
var $BarThick = 1.0;
/*! 黒バーの太さ調整ドット数 */
var $KuroBarCousei = 0.0;
// スタート・ストップコードを含めたコード(テキスト)
var $outputCode = "";
/** @var array<string,string> プロパティの定義配列 */
private $validProperties;
public function __construct() {
if (version_compare(PHP_VERSION, '8.2.0', '>=')) {
// PHP 8.2以降の場合
$this->validProperties = [
'TextWrite' => 'bool',
'FontName' => 'string',
'FontSize' => 'float',
'dispStartStopCode' => 'bool',
'BarThick' => 'float',
'KuroBarCousei' => 'float',
'outputCode' => 'string'
];
} else {
// PHP 8.2未満の場合
$this->validProperties = array(
'TextWrite' => 'bool',
'FontName' => 'string',
'FontSize' => 'float',
'dispStartStopCode' => 'bool',
'BarThick' => 'float',
'KuroBarCousei' => 'float',
'outputCode' => 'string'
);
}
}
public function setProperty($name, $value) {
if (isset($this->validProperties[$name])) {
$this->$name = $value;
}
}
public function getProperty($name) {
//return $this->$name ?? null;
return isset($this->$name) ? $this->$name : null;
}
動的プロパティを勘違いしており、バーコードクラス側で宣言されていないプロパティを使う側で使用しようとしたときに発生することだと改めて認識しました。
従って
セッター・ゲッターのプロパティは不要になります。
改めて、ソースコード全体を整備しました。
コメントもPHP7.0 以降のコメントに変更したためインテリセンスも正常に機能し、型チェックも行えるようになります。
リリースまでは、1週間程度お待ちください。おそらくPHP9 でも問題なく動作するバージョンです。
このスレッドの途中の経緯につきましては、今のところ残しておきますが、皆様が混乱してしまうと思いますので、次回リリース時には、削除してここに書いた最新の対応結果だけ記述させていただきます。
よろしくお願いいたします。
- YY-BOARD -