Dinamik php sınıfları zamanında üretmek?

5 Cevap php

İşte yapmak istediğim şey:

$clsName = substr(md5(rand()),0,10); //generate a random name
$cls = new $clsName(); //create a new instance

function __autoload($class_name)
{
  //define that instance dynamically
}

Açıkçası bu aslında ne yapıyorum değil, ama temelde bir sınıf için bilinmeyen isimler var ve adına göre, ben bazı özellikleri vb ile sınıf oluşturmak istiyoruz

Ben eval kullanarak denedim () ama o beni özel ve $ this-> referanslar üzerinde uyuyor veriyor ...

/ / Düzenle

Tamam, belli ki benim kısa ve tatlı cevaplar sağlamak mümkün olabilir olanlar arasında büyük fitne ve şaşkınlık yarattı "Burada yapmak istediğim buydu". Gerçek bir cevap alma umuduyla ben daha ayrıntılı olacak.

Ben korumak sitede kod ipuçlarını kullanarak bir doğrulama çerçeve var. Her bir fonksiyon iki tanımları var

function DoSomething($param, $param2){
   //code
}
function DoSomething_Validate(vInteger $param, vFloat $param2){
   //return what to do if validation fails
}

Benim veritabanında birincil anahtarlar için bir doğrulayıcı eklemek için arıyorum. HER tablo (203) için ayrı bir sınıf oluşturmak istemiyorum. Yani benim planı gibi bir şey yapmak oldu

function DoSomething_Validate(vPrimaryKey_Products $id){ }

__ Özdevinimli_yükle vPrimaryKey bir alt sınıfı oluşturmak ve Ürünleri tablo parametresini ayarlayın nerede.

Şimdi mutlu musun?

5 Cevap

Bu, neredeyse kesinlikle kötü bir fikirdir.

Ben zaman daha iyi sizin için sınıf tanımlarını yaratacak bir komut dosyası oluşturma harcanan olacağını düşünüyorum, ve zamanında yapmaya çalışıyor değil.

Gibi bir komut satırı imza ile bir şey:

./generate_classes_from_db <host> <database> [tables] [output dir]

komik, aslında bu eval böyle kötü bir fikir gibi görünmüyor birkaç şeylerden biridir.

sürece hiçbir kullanıcı girişi hiç eval girecek sağlamak gibi.

Hala sizin kod alışkanlık önbelleğe alınacak bir bytekod önbellek vs vs kullanıyor ama eval güvenlik sorunları oldukça fazla eval kullanıcı inputy olan, ya da yanlış kapsamında biten için ilgili zaman gibi olumsuz yanları var.

Eğer ne yaptığınızı biliyorsanız, eval size bu konuda yardımcı olacaktır.

O dedi, bence sen hiçbir tip-ima kendi doğrulama için itimat zaman çok daha iyi, ama bir işlevi var

DoSomething_Validate($id)
{ 
   // get_class($id) and other validation foo here
}

Eval () kullanma gerçekten kötü bir fikirdir. Bu büyük bir güvenlik açığı açılır. Sadece kullanmak yok!

Bu gerçekten çok çok kötü bir fikir olduğunu nasıl herkes cevapları okuyunuz.

Bunu anladığınızda, burada nasıl yaparsın küçük bir demo, ama, bunu yapmamalıyız.


<?php
$clname = "TestClass";

eval("class $clname{}; \$cls = new $clname();");

var_dump($cls);

Bu eski bir soru olduğunu biliyorum ve iş OLACAKTIR cevaplar vardır, ama ben orijinal soruya cevap verecek birkaç pasaj sunmak istedik ve ben bir cevap ararken ne zaman gibi birisi burada bitmeli, daha geniş bir çözüm sunuyoruz düşünüyorum Bu sorun için.

Create Single Dynamic Class

<?php
// Without properties
$myclassname = "anewclassname";
eval("class {$myclassname} { }";
// With a property
$myclassname = "anewclassname";
$myproperty = "newproperty";
eval("class {$myclassname} { protected \${$myproperty}; }";
?>

Sürece düzgün metin kaçmak gibi, siz de orada bir işlevi ekleyebilirsiniz.

Ama ne özgün soru belirtildiği gibi dinamik kendisi gibi veritabanındaki her tablo için bir sınıf oluşturma gibi dinamik olabilir şey dayalı sınıfları oluşturmak istiyorsanız dersiniz?

Create Multiple Dynamic Classes

<?php

// Assumes $dbh is a pdo connection handle to your MySQL database
$stmt=$dbh->prepare("show tables");
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$handle = null;
$classcode = '';
foreach ($result as $key => $value) {
    foreach ($value as $key => $value) {
        $classcode = "class {$value} { ";
        $stmt2=$dbh->prepare("DESC $value");
        $stmt2->execute();
        $result2 = $stmt2->fetchAll(PDO::FETCH_ASSOC);
        foreach ($result2 as $key => $value) {
            $classcode .= "public \${$value['Field']}; ";
        }
        $classcode .=  "}";
        eval($classcode);
    }
}

?>

Bu dinamik bir veritabanındaki her tablo için bir sınıf oluşturur. Her sınıf için, her sütun sonra adlı bir özellik AYRICA oluşturulmuş olur.

Şimdi bunu yapmamalısınız işaret ediyor. Sürece eval neler kontrol olarak, güvenlik riski bir sorun değildir. AMA - Bu konuda yeterince derin düşünüyorsanız daha mantıklı bir çözüm büyük olasılıkla var. Ben dinamik olarak yeni sınıflar oluşturmak için mükemmel bir kullanım durumunda olduğunu sanıyordum. Sorunun dikkatli incelenmesi tersini kanıtladı.

Bir potansiyel çözüm - sadece veri kapları ve herhangi bir yöntem gerekmez nesneleri oluşturmak için stdclass kullanın.

Ayrıca - belirtildiği gibi, elle sınıfların çok üretmek için bir komut dosyası kullanabilirsiniz. Veritabanı tabloları yansıtma sınıfların durumunda, bir dosyaya bu bilgi yazmak, yukarıda ve yerine eval yapmanın ben aynı mantığı kullanabilirsiniz.