Curiosa creación de objetos en PHP

Recuerda mucho a Javascript y frameworks tipo jQuery, para ello utiliza métodos encadenados y un objeto genérico:


// Define a new class
$animal = $class->new()
  ->def('init', function($t, $name) {
    $t->name = $name;
  })
  ->def('speak', function($t) {
    echo "My name is $t->name\n";
  });

// Extend a class
$dog = $animal->extend()
  ->def('speak', function($t) {
    echo "My name is $t->name, I have just met you and I love you, SQUIRREL!\n";
  })
  ->def('bark', function($t) {
    echo "Woof!\n";
  });

Para poder realizar esto se necesita crear la clase Obj:

class Obj {
  public function __construct($methods=array()) {
    $this->methods = $methods;
  }

  public function method($name) {
    if (!isset($this->methods[$name]))
      throw new BadMethodCallException();
    return $this->methods[$name];
  }

  public function fn($name, $fn) {
    $this->methods[$name] = $fn;
    return $this;
  }

  public function __call($name, $args) {
    return call_user_func_array(
      $this->method($name),
      array_merge(array($this), $args)
    );
  }
}

// Allow chaining method calls off the constructor..
function Obj($methods=array())
{
return new Obj($methods);
}

PHP Object Oriented Programming Reinvented

Vía / PHPDeveloper.org

|

Steponas Kazakevicius’ Blog: Interruptable file download

Steponas Kazakevicius has written up a new tutorial about file uploading and, more specifically, making an upload tool that can handle interruptions. Have you ever been to a website that offers downloads of stuff? And while you are waiting for the download, there are lots of ads around? Sure you have. I have too. The last day I was downloading stuf …

Post original

|

Understanding and Applying Polymorphism in PHP

In object oriented programming, polymorphism is a powerful and fundamental tool. It can be used to create a more organic flow in your application. This tutorial will describe the general concept of polymorphism, and how it can easily be deployed in PHP. What is Polymorphism? Polymorphism is a long word for a very simple concept. Polymorphism descri…

Post original

Añadir estilos y scripts a la administración de plugins en WordPress

Cuando estamos desarrollando un plugin para WordPress y queremos que la administración del plugin tenga estilos y scripts propios, ya sea para darle cierta interactividad o diseño, o bien podremos incluir los estilos o librerías a pelo en la página del plugin, o bien podremos hacer que WordPress añada lo estilos y los scripts en el head del HTML. Para realizar esto, deberemos utilizar las acciones admin_print_styles y admin_print_scripts:

add_action('admin_print_styles', 'incluir_css');
add_action('admin_print_scripts', 'incluir_script');

function incluir_css() {
  echo '';
}

function incluir_script() {
  echo '';
}

Así de sencillo.

|

PHPBuilder.com: Downloading and Parsing Gmail Messages in PHP

New on PHPBuilder.com today there’s a tutorial showing you how to download and parse messages from Google Mail. In their case it’s grabbing and parsing submissions from a form. Some friends of mine publish a literary journal that accepts submissions via email. At their request I wrote a script to download messages from the journal’s Gmail account a …

Post original

Usar Solr desde PHP

Solr es un servidor de búsquedas basado en Lucene que nos puede venir muy bien cuando nuestro proyecto web necesite un motor de búsqueda en condiciones, siendo una alternativa a Sphinx. Aunque está basado en Java, existe una librería que permite trabajar con ella, otra posibilidad sería utilizar Zend Search, ya que usa el formato de Lucene, aunque en una versión anterior a la que utiliza Solr, por lo que nos encontramos con incompatibilidades.

El uso de la librería es bastante sencillo:

  require_once( 'Apache/Solr/Service.php' );
  
  // 
  // 
  // Try to connect to the named server, port, and url
  // 
  $solr = new Apache_Solr_Service( 'localhost', '8983', '/solr' );
  
  if ( ! $solr->ping() ) {
    echo 'Solr service not responding.';
    exit;
  }
  
  //
  //
  // Create two documents to represent two auto parts.
  // In practice, documents would likely be assembled from a 
  //   database query. 
  //
  $parts = array(
    'spark_plug' => array(
      'partno' => 1,
      'name' => 'Spark plug',
      'model' => array( 'Boxster', '924' ),
      'year' => array( 1999, 2000 ),
      'price' => 25.00,
      'inStock' => true,
    ),
    'windshield' => array(
      'partno' => 2,
      'name' => 'Windshield',
      'model' => '911',
      'year' => array( 1999, 2000 ),
      'price' => 15.00,
      'inStock' => false,
    )
  );
    
  $documents = array();
  
  foreach ( $parts as $item => $fields ) {
    $part = new Apache_Solr_Document();
    
    foreach ( $fields as $key => $value ) {
      if ( is_array( $value ) ) {
        foreach ( $value as $datum ) {
          $part->setMultiValue( $key, $datum );
        }
      }
      else {
        $part->$key = $value;
      }
    }
    
    $documents[] = $part;
  }
    
  //
  //
  // Load the documents into the index
  // 
  try {
    $solr->addDocuments( $documents );
    $solr->commit();
    $solr->optimize();
  }
  catch ( Exception $e ) {
    echo $e->getMessage();
  }
  
  //
  // 
  // Run some queries. Provide the raw path, a starting offset
  //   for result documents, and the maximum number of result
  //   documents to return. You can also use a fourth parameter
  //   to control how results are sorted and highlighted, 
  //   among other options.
  //
  $offset = 0;
  $limit = 10;
  
  $queries = array(
    'partno: 1 OR partno: 2',
    'model: Boxster',
    'name: plug'
  );

  foreach ( $queries as $query ) {
    $response = $solr->search( $query, $offset, $limit );
    
    if ( $response->getHttpStatus() == 200 ) { 
      // print_r( $response->getRawResponse() );
      
      if ( $response->response->numFound > 0 ) {
        echo "$query 
"; foreach ( $response->response->docs as $doc ) { echo "$doc->partno $doc->name
"; } echo '
'; } } else { echo $response->getHttpStatusMessage(); } }

También recomiendo que en el esquema de Solr añadamos el filtro de caracteres mapping-ISOLatin1Accent.txt, para que no tengamos problemas a la hora de buscar palabras acentuadas sin usar los acentos (cancion => canción).

Solr PHP Client

|

Como utilizar uploaders Flash con PHP

No soy muy amigo de Flash, no soy enemigo, pero sinceramente, prefiero hacer las cosas en HTML, CSS y Javascript, tampoco voy a entrar en la polémica HTML vs Flash. Pero sí es cierto, que subir ficheros desde la web puede ser un poco desesperante, sobre todo para aplicaciones web tipo galerías de imágenes en donde se suelen subir varios ficheros simultáneamente.

Subir ficheros mediante Flash nos aporta varias ventajas frente a el HTML normal: puedes poner filtros de archivos, tratar los ficheros previamente, subidas multiples, indicador de progreso, … Y aunque nos pese, el cliente/usuario siempre tiene la razón, y estas comodidades son muy bien valoradas por los usuarios.

El tutorial que os paso explica cómo crear el uploader Flash y como realizar la parte PHP, a mi me va a venir de perlas.

How to Use Flash for File Upload with PHP