私は、手続き型の ajax ファイルから OOP クラスを呼び出す ajax ファイルに一度再設計しなければならなかったシステムを開発しています。
初めてクラスを開発したとき、各クラスには、ajax ファイルと同じことを手続き的な方法で行うメソッドがありましたが、それらを再呼び出ししたいときにいつでも役立つ可能性のある他のメソッドがありました。
その後、問題が発生しました。継承を使い始めましたが、2 つ以上のクラスが必要になると完全に惨事になることに気づきました。どのように修正していますか?必要な共通関数を含む静的クラスを作成してから、静的な方法で単一のメソッドを使用して ajax クラスからそれらを呼び出します。作成した静的クラスの例を次に示します。
静的クラス:
<?php
class InstitutionFunctions
{
public static $Statement;
public static function InstitutionExists($InstitutionId = -1)
{
self :: $Statement->prepare('SELECT COUNT(Id) FROM institutions WHERE Id = ?');
self :: $Statement->bind_param('i', $InstitutionId);
self :: $Statement->bind_result($InstitutionCount);
self :: $Statement->execute();
self :: $Statement->fetch();
if($InstitutionCount > 0)
return true;
return false;
}
public static function BlockInstitutionOnly($InstitutionId = -1, $BlockValue = 1)
{
self :: $Statement->prepare('UPDATE institutions SET Blocked = ? WHERE Id = ?');
self :: $Statement->bind_param('ii', $BlockValue, $InstitutionId);
self :: $Statement->execute();
}
public static function BlockInstitutionStudents($InstitutionId = -1, $BlockValue = 1)
{
self :: $Statement->prepare('UPDATE classroom SET Blocked = ? WHERE Institution = ? AND Rank = '. STUDENT);
self :: $Statement->bind_param('ii', $BlockValue, $InstitutionId);
self :: $Statement->execute();
}
public static function Create($InstitutionName = '')
{
self :: $Statement->prepare('INSERT INTO institutions (Name) VALUES (?)');
self :: $Statement->bind_param('s', $InstitutionName);
self :: $Statement->execute();
}
public static function GetInstitutionIdByName($InstitutionName = '')
{
self :: $Statement->prepare('SELECT Id FROM institutions WHERE Name = ?');
self :: $Statement->bind_param('s', $InstitutionName);
self :: $Statement->bind_result($InstitutionId);
self :: $Statement->execute();
self :: $Statement->fetch();
return $InstitutionId;
}
public static function InstitutionHasAssignments($InstitutionId = -1)
{
self :: $Statement->prepare('SELECT COUNT(Institution) FROM assignments WHERE Institution = ?');
self :: $Statement->bind_param('i', $InstitutionId);
self :: $Statement->bind_result($AssignmentCount);
self :: $Statement->execute();
self :: $Statement->fetch();
if($AssignmentCount > 0)
return true;
return false;
}
public static function Delete($InstitutionId = -1)
{
self :: $Statement->prepare('DELETE FROM institutions WHERE Id = ?');
self :: $Statement->bind_param('i', $InstitutionId);
self :: $Statement->execute();
}
public static function GetInstitutionBlockValue($InstitutionId = -1)
{
self :: $Statement->prepare('SELECT Blocked FROM institutions WHERE Id = ?');
self :: $Statement->bind_param('i', $InstitutionId);
self :: $Statement->bind_result($BlockValue);
self :: $Statement->execute();
self :: $Statement->fetch();
return $BlockValue;
}
}
?>
そして、ajax クラスはそれを次のように呼び出します。
<?php
class BlockInstitution
{
public $User;
public $InstitutionId;
public $BlockValue;
public $Error;
public $ErrorN;
public function __construct($User, $InstitutionId = -1, $BlockValue = '1')
{
$this->User = $User;
$this->InstitutionId = $InstitutionId;
$this->BlockValue = $BlockValue;
}
public function ValidateAndBlock()
{
if(!$this->User->SessionExist)
{
$this->Error = 'El proceso se canceló porque tu sesión ha sido cerrada.';
$this->ErrorN = 1;
return false;
}
if($this->User->Session['Rank'] != ADMIN)
{
$this->Error = 'No estás autorizado para realizar esta acción.';
$this->ErrorN = 2;
return false;
}
if(!InstitutionFunctions :: InstitutionExists($this->InstitutionId))
{
$this->Error = 'Esta institución no existe.';
$this->ErrorN = 3;
return false;
}
InstitutionFunctions :: BlockInstitutionOnly($this->InstitutionId, $this->BlockValue);
InstitutionFunctions :: BlockInstitutionStudents($this->InstitutionId, $this->BlockValue);
$this->Error = '';
$this->ErrorN = -1;
return true;
}
}
?>
私がこれを正しい方法で行っているかどうかを知りたいのですが、静的メソッドはテストが難しいため、推奨されていないことをどこかで読みました。これも私の場合かどうかを知りたいです。
そうでなければ、それらを単一の関数に分離したほうがよいでしょうか? 静的クラスを含めると、CPU をもう少し多く使用することはわかっていますが、インスタンスを作成していないため、メモリを節約できます。
これが、手続き型を使用する代わりに OOP を使用する理由の 1 つですが、よく知られているように、OOP はより多くの CPU/メモリを消費する可能性があります。ありがとうございます 感想お待ちしてます!