PHP-Kenntnisse: So vermeiden Sie geschickt einige fehlerhafte Codes in PHP-Programmen

无忌哥哥
Freigeben: 2023-04-03 06:54:01
Original
1538 Leute haben es durchsucht

In diesem Artikel erfahren Sie, wie Sie fehlerhaften Code im PHP-Beispielcode finden und wie Sie das Problem beheben können.

Ich beschäftige mich seit fast einem Jahr mit der PHP-Entwicklung und habe in dieser Zeit viele Techniken in der Produktionsumgebung gelernt Informationen zum Codebuch, ich habe einige Gedanken zum Schreiben von Code, und ich habe viele gute und schlechte Codes gesehen, die von anderen geschrieben wurden. Lassen Sie mich hier über meine eigenen Erkenntnisse und Verbesserungen sprechen.

Dieser Blog drückt meine eigenen Gefühle aus. Beim Schreiben von Code lege ich Regeln fest, die den Code klar und lesbar machen und Fallstricke vermeiden können. Obwohl diese einfachen Regeln möglicherweise nicht so aufregend aussehen wie Entwurfsmuster, können sie bei regelmäßiger Beachtung dazu führen, dass Ihr Code sauberer aussieht.

1. Verwenden Sie keine nicht deklarierten Variablen außerhalb des Objekts

Dieses Problem ist möglicherweise nicht leicht zu verstehen, wenn es ausgedrückt wird. Dieses Problem wird durch die Eigenschaften der PHP-Sprache selbst bestimmt. Da PHP eine schwach typisierte dynamische Skriptsprache ist, werden dieser Sprache in vielen Fällen sehr lockere Bedingungen für Entwickler zum Schreiben von Code gegeben. Doch oft können diese Annehmlichkeiten auch zu Fallstricken werden, daher sollten Sie bei der Verwendung einiger praktischer Schreibmethoden in dynamischen Sprachen besondere Aufmerksamkeit auf sich ziehen.

Lassen Sie uns zunächst eine Klasse deklarieren. Der Hintergrund dieser Benutzerklasse ist so festgelegt, dass sie mit dem Framework geliefert wird und nicht geändert werden darf nicht leicht zu finden. Tatsächlich kann sich der Fall auf die Request-Klasse des Laravel-Frameworks beziehen ganz zufriedenstellend sein, aber als nächstes müssen wir diese Klasse betreiben:

class User {
  public $username;
  public $password;
  
  public $otherInfo = [];
  
  
  public function readUserInfo() {
    return [
      'username' => $this->username,
      'password' => $this->password,
    ];
  }
  
  public function addAtri($info) {
    array_push($this->otherInfo, $info);
  }
}
Nach dem Login kopieren

Solcher Code kann vollständig in PHP ausgeführt werden und meldet keinen Fehler, sondern einen solchen Code wird einige nachfolgende Dinge beeinträchtigen. Wir gehen nun davon aus, dass der obige Code ein Interceptor im PHP-Webprojekt ist oder als Middleware bezeichnet werden kann. Dann verwenden wir die Instanz dieser Klasse im Controller und verwenden die in der Middleware hinzugefügte Variable wie folgt: >

$user = new User();
$user->userRealName = "hello world";
Nach dem Login kopieren

Das hier festgelegte Szenario ist, dass WebOperate eine Middleware ist und alle Controller diese Middleware verwenden, um den Controller zu erreichen. Danach wird die entsprechende Controller-Funktion verarbeitet. Als nächstes injiziert der Controller die Middleware-Instanz, die der Controller verwenden soll, aber der Middleware-Entwickler kümmert sich nicht sonderlich um deren Existenz:

 class WebOperate {
   public function doOprate(User $user) {
     $user->userRealName = "hello world";
     next($user);
   }
 }
Nach dem Login kopieren

Und solcher Code kann Als nächstes möchte der Entwickler eine weitere Benutzerklasse implementieren und dieser Benutzerklasse einige andere Funktionen hinzufügen. Wie bereits erwähnt, ist diese Klasse schwer zu finden und Änderungen sind nicht zulässig Funktionen verwenden diese Klasse, daher können wir nur Methoden erben und hinzufügen. Je nach Entwicklungserfahrung gehen Entwickler davon aus, dass die Variable userRealName in der User-Klasse vorhanden ist. Daher ist dies die Schreibmethode:

Zuerst die von diesem Benutzer abgeleitete Teacher-Klasse:

 class IndexController {
   public function index(User $user) {
     return $user->userRealName;
   }
 }
Nach dem Login kopieren

Auf diese Weise kann unser Lehrer „Hallo“ sagen, aber zu diesem Zeitpunkt möchten wir immer noch den richtigen Namen des Lehrers in unserem Controller wissen, was sollen wir tun? Basierend auf der Erfahrung können wir die injizierte Klasse in „Lehrer“ ändern und den richtigen Namen zurückgeben:

 class Teacher extends User {
   public function sayHello() {
     return "hello world";
   }
 }
Nach dem Login kopieren

Dann tritt das Problem tatsächlich nicht auf In der Benutzerklasse hat diese Variable also überhaupt keinen Wert, aber erfahrungsgemäß wurde der Middleware bereits einmal ein Wert zugewiesen, sodass wir ihn direkt verwenden können, aber es gibt keinen solchen Wert. Wir haben mit der Suche begonnen Im Quellcode wurde festgestellt, dass diese Variable nicht in der geerbten Benutzerklasse vorhanden ist. Warum kann diese Variable dann verwendet werden, weil in der Middleware die Stärke des Benutzers bezahlt wird?

Wir können also nicht deklarierte Variablen nicht direkt in einer Klasse verwenden.

Wir sollten so schreiben:

 class IndexController {
   public function index(Teacher $user) {
     return $user->userRealName;
   }
 }
Nach dem Login kopieren

Für Middleware wie diese können geerbte Klassen beim Aufruf auch dieselbe Methode verwenden, das ist sehr einfach Und es ist sehr schwierig, schlechten Geschmack zu erzeugen.

2. Klasse oder Array

Tatsächlich leitet dieses Problem auch ein anderes Problem ab, nämlich das Problem des Funktionsrückgabewerts.

Zunächst möchte ich klarstellen, dass ich persönlich der Meinung bin, dass es für eine Funktion nicht gut ist, mehrere Arten von Werten zurückzugeben. Obwohl dies in dynamischen Sprachen sehr häufig vorkommt, ist dies auch bei vielen nativen Methoden von PHP der Fall , aber die Verwendung dieser Methode in der Produktion führt zu Unsicherheiten bei den Funktionsrückgaben. Wir müssen viele Urteile fällen, um unsere Schlussfolgerungen zu beweisen. Wenn es jedoch nur einen Rückgabewerttyp gibt, können wir den Rückgabewert direkt beurteilen.

ähnelt dem folgenden Code:

class WebOperate {
  public function doOprate(User $user) {
    $user->addAtri([
      'userRealName' => 'hello world',
    ]);
    next($user);
  }
}
Nach dem Login kopieren

Ein solcher Code wird vom Anrufer häufig noch einmal wie folgt beurteilt:

public function addNewUser() {
    $res = $this->addData();
    if ($res) {
      return true;
    } else {
      return [
        'error' => 1,
        'errormsg' => "没有添加成功"
      ];
    }
  }
Nach dem Login kopieren

Code wie dieser erscheint fast jedes Mal, wenn diese Funktion aufgerufen wird. Der Code ist nicht nur unansehnlich, sondern auch sehr aufgebläht.

Code wie dieser muss verbessert werden. Begrenzen Sie zunächst den Rückgabewert der Funktion. Beispielsweise lassen wir diese Funktion nur Zahlen vom Typ bool zurückgeben:

public function index() {
    $res = $this->addNewUser();
    if (is_array($res) && isset($res['error'])) {
      return isset($res['errormsg']) ? $res['errormsg'] : "未知错误";
    }
    return "成功";
  }
Nach dem Login kopieren

但是,显然,很多时候,我们要的不是简单的真价值,所以,我们会选择返回更多信息,这个时候,我们可以有三种处理方式。

1)返回int类型的数,然后通过这个int类型的数去判断处理结果,我们可以添加上映射关系:

class Operate{
  public $operateRes = [
    0 => '成功',
    1 => '添加失败',
    2 => '未知错误',
  ];
  
  
  public function addNewUser() {
    $res = $this->addData();
    if ($res) {
      return 0;
    } else if ($res > 1) {
      return 1;
    }
    return 2;
  }
  
}
Nach dem Login kopieren

这样方法的调用者就可以很简单的使用方法并给出提示了:

$opera = new Operate();
$res = $opera->addNewUser();
return $opera->operateRes[$res];
Nach dem Login kopieren

给出统一的返回值类型的时候就完全不需要判断返回值类型而且可以设置一个规范返回提示。

2)我们也可以使用数组

3)数组给人不缺定性,因为很多时候,数组里可以认为的少写一些元素,如果少写了,程序直接报错,很不好。

所以第三种方式就是建议将固定格式的返回,写成一个类,做返回的时候,使用这个类:

class Operate{
  public function addNewUser() {
    $res = $this->addData();
    $result = new Result();
    if ($res) {
      $result->errno = 0;
      $result->errmsg = "成功";
    } else if ($res > 1) {
      $result->errno = 1;
      $result->errmsg = "失败";
    }
    $result->errno = 2;
    $result->errmsg = "未知错误";
    return $result;
  }
  
}

class Result {
  public $errno;
  public $errmsg;
}
Nach dem Login kopieren

这样的返回,保证了所有变量的存在,同样可以减少一次判断。

所以,综合以上,在我们返回结果的时候,尽量使用同种类型的变量,尽量减少使用数组返回。

Das obige ist der detaillierte Inhalt vonPHP-Kenntnisse: So vermeiden Sie geschickt einige fehlerhafte Codes in PHP-Programmen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!