<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ecommerce Ninja - The Zachary Fox Blog &#187; PHP</title>
	<atom:link href="http://www.zacharyfox.com/blog/category/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.zacharyfox.com/blog</link>
	<description></description>
	<lastBuildDate>Fri, 18 Sep 2009 15:36:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Simple Model CRUD with PHP 5.3</title>
		<link>http://www.zacharyfox.com/blog/php/simple-model-crud-with-php-5-3</link>
		<comments>http://www.zacharyfox.com/blog/php/simple-model-crud-with-php-5-3#comments</comments>
		<pubDate>Wed, 02 Sep 2009 20:57:28 +0000</pubDate>
		<dc:creator>Zachary Fox</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.zacharyfox.com/blog/?p=65</guid>
		<description><![CDATA[I&#8217;ve been wanting to mess around with some of the new features in PHP 5.3, so I took the opportunity to write a base model class that can be used for simple db based models. This isn&#8217;t really production type code, more of an example of &#8220;look what php can do now&#8221;, although with some [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been wanting to mess around with some of the new features in PHP 5.3, so I took the opportunity to write a base model class that can be used for simple db based models. This isn&#8217;t really production type code, more of an example of &#8220;look what php can do now&#8221;, although with some error handling and tweaking, it might be a good start to a lightweight active record type base class.</p>
<p>One of the biggest new changes to 5.3 is late static binding. It has never been possible in PHP to get the name of the calling class when you called a static method inherited from a parent. Now with late static binding, this is possible. This is what works the &#8220;magic&#8221; in this base class.</p>
<h3>The Assumptions</h3>
<p>Models represent an entity stored in the database (think active record):</p>
<ul>
<li>In one table per class named the same as the model class, but all lower case</li>
<li>With one column for each property</li>
<li>With a primary key column named &#8216;id&#8217;</li>
</ul>
<p>In addition, a global variable $db should contain a PHP PDO object.</p>
<h3>The Base Class</h3>
<p>One of the things I&#8217;d like to be able to do is create an object from an array of parameters, whether they come from a database or not. I might want to create from a set of parameters and be able to act on it immediately, without having to reload it. I use reflection here to ensure that all the class properties are set, throwing an exception if any are missing.</p>
<p>Note also in the get and getAll methods, the calls to new static(). What this does is create an object of the class you are calling, rather than the class that the method exists in. This wasn&#8217;t possible until PHP 5.3, and is really the key to being able to use static inheritance.</p>
<p>In addition, there is a lambda function in the save method, this is new to 5.3 also. And there are a few examples of a new php function &#8220;get_called_class()&#8221; which will return the name of the class that was called.</p>
<pre class="vci_code">
<span class="c28">&lt;?php</span>
<span class="c26">/**</span>
<span class="c26"> * Base class for all models</span>
<span class="c26"> *</span>
<span class="c26"> * @author Zachary Fox</span>
<span class="c26"> */</span>
abstract <span class="c32">class</span> Base
<span class="c28">{</span>
    <span class="c26">/**</span>
<span class="c26">     * Pass properties to construct</span>
<span class="c26">     *</span>
<span class="c26">     * @param mixed[] $properties The object properties</span>
<span class="c26">     * </span>
<span class="c26">     * @throws Exception</span>
<span class="c26">     */</span>
    protected <span class="c31">function</span> __construct<span class="c28">(</span><span class="c32">Array</span> <span class="c30">$</span><span class="c29">properties</span><span class="c28">)</span>
    <span class="c28">{</span>
        <span class="c30">$</span><span class="c29">reflect</span> <span class="c30">=</span> <span class="c31">new</span> ReflectionObject<span class="c28">(</span><span class="c30">$</span><span class="c29">this</span><span class="c28">)</span>;

        <span class="c30">foreach</span> <span class="c28">(</span><span class="c30">$</span><span class="c29">reflect</span><span class="c32">-&gt;</span>getProperties<span class="c28">()</span> as <span class="c30">$</span><span class="c29">property</span><span class="c28">)</span> <span class="c28">{</span>
            <span class="c30">if</span> <span class="c28">(</span><span class="c30">!</span><span class="c29">array_key_exists</span><span class="c28">(</span><span class="c30">$</span><span class="c29">property</span><span class="c32">-&gt;</span>name, <span class="c30">$</span><span class="c29">properties</span><span class="c28">))</span> <span class="c28">{</span>
                throw <span class="c31">new</span> Exception<span class="c28">(</span>&quot;<span class="c27">Unable to create object. Missing property: {</span><span class="c30">$</span><span class="c29">property</span><span class="c27">-&gt;name}</span>&quot;<span class="c28">)</span>;
            <span class="c28">}</span>

            <span class="c30">$</span><span class="c29">this</span><span class="c30">-</span><span class="c30">&gt;</span><span class="c28">{</span><span class="c30">$</span><span class="c29">property</span><span class="c32">-&gt;</span>name<span class="c28">}</span> <span class="c30">=</span> <span class="c30">$</span><span class="c29">properties</span><span class="c28">[</span><span class="c30">$</span><span class="c29">property</span><span class="c32">-&gt;</span>name<span class="c28">]</span>;
        <span class="c28">}</span>
    <span class="c28">}</span>

    <span class="c26">/**</span>
<span class="c26">     * Get all class properties</span>
<span class="c26">     *</span>
<span class="c26">     * @return string[]</span>
<span class="c26">     */</span>
    protected <span class="c32">static</span> <span class="c31">function</span> getFields<span class="c28">()</span>
    <span class="c28">{</span>
        <span class="c32">static</span> <span class="c30">$</span><span class="c29">fields</span> <span class="c30">=</span> <span class="c32">array</span><span class="c28">()</span>;
        <span class="c30">$</span><span class="c29">called_class</span>  <span class="c30">=</span> get_called_class<span class="c28">()</span>;

        <span class="c30">if</span> <span class="c28">(</span><span class="c30">!</span><span class="c29">array_key_exists</span><span class="c28">(</span><span class="c30">$</span><span class="c29">called_class</span>, <span class="c30">$</span><span class="c29">fields</span><span class="c28">))</span> <span class="c28">{</span>
            <span class="c30">$</span><span class="c29">reflection_class</span> <span class="c30">=</span> <span class="c31">new</span> ReflectionClass<span class="c28">(</span><span class="c30">$</span><span class="c29">called_class</span><span class="c28">)</span>;

            <span class="c30">$</span><span class="c29">properties</span> <span class="c30">=</span> <span class="c32">array</span><span class="c28">()</span>;

            <span class="c30">foreach</span> <span class="c28">(</span><span class="c30">$</span><span class="c29">reflection_class</span><span class="c32">-&gt;</span>getProperties<span class="c28">()</span> as <span class="c30">$</span><span class="c29">property</span><span class="c28">)</span> <span class="c28">{</span>
                <span class="c30">$</span><span class="c29">properties</span><span class="c28">[]</span> <span class="c30">=</span> <span class="c30">$</span><span class="c29">property</span><span class="c32">-&gt;</span>name;
            <span class="c28">}</span>

            <span class="c30">$</span><span class="c29">fields</span><span class="c28">[</span><span class="c30">$</span><span class="c29">called_class</span><span class="c28">]</span> <span class="c30">=</span> <span class="c30">$</span><span class="c29">properties</span>;
        <span class="c28">}</span>

        <span class="c30">return</span> <span class="c30">$</span><span class="c29">fields</span><span class="c28">[</span><span class="c30">$</span><span class="c29">called_class</span><span class="c28">]</span>;
    <span class="c28">}</span>

    <span class="c26">/**</span>
<span class="c26">     * Get the select statement</span>
<span class="c26">     *</span>
<span class="c26">     * @return string</span>
<span class="c26">     */</span>
    protected <span class="c32">static</span> <span class="c31">function</span> getSelect<span class="c28">()</span>
    <span class="c28">{</span>
        <span class="c30">return</span> &quot;<span class="c27">SELECT </span>&quot; <span class="c30">.</span> <span class="c29">implode</span><span class="c28">(</span>'<span class="c27">, </span>', self<span class="c30">::</span>getFields<span class="c28">())</span> <span class="c30">.</span> &quot;<span class="c27"> FROM </span>&quot; <span class="c30">.</span> <span class="c29">strtolower</span><span class="c28">(</span>get_called_class<span class="c28">())</span>;
    <span class="c28">}</span>

    <span class="c26">/**</span>
<span class="c26">     * Save this object</span>
<span class="c26">     *</span>
<span class="c26">     * @return void</span>
<span class="c26">     */</span>
    protected <span class="c31">function</span> save<span class="c28">()</span>
    <span class="c28">{</span>
        <span class="c32">global</span> <span class="c30">$</span><span class="c29">db</span>;

        <span class="c30">$</span><span class="c29">fields</span>   <span class="c30">=</span> self<span class="c30">::</span>getFields<span class="c28">()</span>;
        <span class="c30">$</span><span class="c29">replace</span>  <span class="c30">=</span> &quot;<span class="c27">REPLACE INTO </span>&quot; <span class="c30">.</span> <span class="c29">strtolower</span><span class="c28">(</span>get_called_class<span class="c28">())</span> <span class="c30">.</span> &quot;<span class="c27">(</span>&quot; <span class="c30">.</span> <span class="c29">implode</span><span class="c28">(</span>'<span class="c27">,</span>', <span class="c30">$</span><span class="c29">fields</span><span class="c28">)</span> <span class="c30">.</span> &quot;<span class="c27">)</span>&quot;;

        <span class="c30">$</span><span class="c29">function</span> <span class="c30">=</span> <span class="c31">function</span> <span class="c28">(</span><span class="c30">$</span><span class="c29">value</span><span class="c28">)</span> <span class="c28">{</span>
            <span class="c30">return</span> '<span class="c27">:</span>' <span class="c30">.</span> <span class="c30">$</span><span class="c29">value</span>;
        <span class="c28">}</span>;

        <span class="c30">$</span><span class="c29">replace</span> <span class="c30">.=</span> &quot;<span class="c27"> VALUES (</span>&quot; <span class="c30">.</span> <span class="c29">implode</span><span class="c28">(</span>'<span class="c27">,</span>', <span class="c29">array_map</span><span class="c28">(</span><span class="c30">$</span><span class="c29">function</span>, <span class="c30">$</span><span class="c29">fields</span><span class="c28">))</span> <span class="c30">.</span> &quot;<span class="c27">)</span>&quot;;

        <span class="c30">$</span><span class="c29">statement</span> <span class="c30">=</span> <span class="c30">$</span><span class="c29">db</span><span class="c32">-&gt;</span>prepare<span class="c28">(</span><span class="c30">$</span><span class="c29">replace</span><span class="c28">)</span>;

        <span class="c30">foreach</span> <span class="c28">(</span><span class="c30">$</span><span class="c29">fields</span> as <span class="c30">$</span><span class="c29">field</span><span class="c28">)</span> <span class="c28">{</span>
            <span class="c30">$</span><span class="c29">statement</span><span class="c32">-&gt;</span>bindParam<span class="c28">(</span><span class="c30">$</span><span class="c29">field</span>, <span class="c30">$</span><span class="c29">this</span><span class="c30">-</span><span class="c30">&gt;</span><span class="c30">$</span><span class="c29">field</span><span class="c28">)</span>;
        <span class="c28">}</span>

        <span class="c30">$</span><span class="c29">statement</span><span class="c32">-&gt;</span>execute<span class="c28">()</span>;
    <span class="c28">}</span>

    <span class="c26">/**</span>
<span class="c26">     * Get a single object by id</span>
<span class="c26">     *</span>
<span class="c26">     * @param integer $id</span>
<span class="c26">     * @return Object</span>
<span class="c26">     */</span>
    public <span class="c32">static</span> <span class="c31">function</span> get<span class="c28">(</span><span class="c30">$</span><span class="c29">id</span><span class="c28">)</span>
    <span class="c28">{</span>
        <span class="c32">global</span> <span class="c30">$</span><span class="c29">db</span>;

        <span class="c30">$</span><span class="c29">select</span>    <span class="c30">=</span> self<span class="c30">::</span>getSelect<span class="c28">()</span> <span class="c30">.</span> &quot;<span class="c27"> WHERE `id` = :id</span>&quot;;
        <span class="c30">$</span><span class="c29">statement</span> <span class="c30">=</span> <span class="c30">$</span><span class="c29">db</span><span class="c32">-&gt;</span>prepare<span class="c28">(</span><span class="c30">$</span><span class="c29">select</span><span class="c28">)</span>;

        <span class="c30">$</span><span class="c29">statement</span><span class="c32">-&gt;</span>bindParam<span class="c28">(</span>'<span class="c27">:id</span>', <span class="c30">$</span><span class="c29">id</span>, PDO<span class="c30">::</span>PARAM_INT<span class="c28">)</span>;
        <span class="c30">$</span><span class="c29">statement</span><span class="c32">-&gt;</span>execute<span class="c28">()</span>;

        <span class="c30">$</span><span class="c29">result</span> <span class="c30">=</span> <span class="c30">$</span><span class="c29">statement</span><span class="c32">-&gt;</span>fetchAll<span class="c28">(</span>PDO<span class="c30">::</span>FETCH_ASSOC<span class="c28">)</span>;

        <span class="c30">return</span> <span class="c31">new</span> <span class="c32">static</span><span class="c28">(</span><span class="c30">$</span><span class="c29">result</span><span class="c28">[</span><span class="c27">0</span><span class="c28">])</span>;
    <span class="c28">}</span>

    <span class="c26">/**</span>
<span class="c26">     * Get all objects</span>
<span class="c26">     *</span>
<span class="c26">     * @return Object[]</span>
<span class="c26">     */</span>
    public <span class="c32">static</span> <span class="c31">function</span> getAll<span class="c28">()</span>
    <span class="c28">{</span>
        <span class="c32">global</span> <span class="c30">$</span><span class="c29">db</span>;

        <span class="c30">$</span><span class="c29">return</span> <span class="c30">=</span> <span class="c32">array</span><span class="c28">()</span>;
        <span class="c30">foreach</span> <span class="c28">(</span><span class="c30">$</span><span class="c29">db</span><span class="c32">-&gt;</span>query<span class="c28">(</span>self<span class="c30">::</span>getSelect<span class="c28">()</span>, PDO<span class="c30">::</span>FETCH_ASSOC<span class="c28">)</span> as <span class="c30">$</span><span class="c29">row</span><span class="c28">)</span> <span class="c28">{</span>
            <span class="c30">$</span><span class="c29">return</span><span class="c28">[]</span> <span class="c30">=</span> <span class="c31">new</span> <span class="c32">static</span><span class="c28">(</span><span class="c30">$</span><span class="c29">row</span><span class="c28">)</span>;
        <span class="c28">}</span>

        <span class="c30">return</span> <span class="c30">$</span><span class="c29">return</span>;
    <span class="c28">}</span>

    <span class="c26">/**</span>
<span class="c26">     * Create a new object</span>
<span class="c26">     *</span>
<span class="c26">     * @param mixed[] $properties Properties</span>
<span class="c26">     * </span>
<span class="c26">     * @return Object</span>
<span class="c26">     */</span>
    public <span class="c32">static</span> <span class="c31">function</span> create<span class="c28">(</span><span class="c32">Array</span> <span class="c30">$</span><span class="c29">properties</span><span class="c28">)</span>
    <span class="c28">{</span>
        <span class="c32">global</span> <span class="c30">$</span><span class="c29">db</span>;

        <span class="c30">$</span><span class="c29">properties</span><span class="c28">[</span>'<span class="c27">id</span>'<span class="c28">]</span> <span class="c30">=</span> <span class="c28">(</span><span class="c30">$</span><span class="c29">db</span><span class="c32">-&gt;</span>query<span class="c28">(</span>'<span class="c27">SELECT MAX(id) FROM </span>' <span class="c30">.</span> <span class="c29">strtolower</span><span class="c28">(</span>get_called_class<span class="c28">()))</span><span class="c32">-&gt;</span>fetchColumn<span class="c28">()</span> <span class="c30">+</span> <span class="c27">1</span><span class="c28">)</span>;
        <span class="c30">$</span><span class="c29">object</span> <span class="c30">=</span> <span class="c31">new</span> <span class="c32">static</span><span class="c28">(</span><span class="c30">$</span><span class="c29">properties</span><span class="c28">)</span>;
        <span class="c30">$</span><span class="c29">object</span><span class="c32">-&gt;</span>save<span class="c28">()</span>;
        <span class="c30">return</span> <span class="c30">$</span><span class="c29">object</span>;
    <span class="c28">}</span>

    <span class="c26">/**</span>
<span class="c26">     * Update an object</span>
<span class="c26">     *</span>
<span class="c26">     * @param mixed[] $properties Properties</span>
<span class="c26">     * </span>
<span class="c26">     * @return void</span>
<span class="c26">     */</span>
    public <span class="c31">function</span> update<span class="c28">(</span><span class="c32">Array</span> <span class="c30">$</span><span class="c29">properties</span><span class="c28">)</span>
    <span class="c28">{</span>
        <span class="c30">foreach</span> <span class="c28">(</span><span class="c30">$</span><span class="c29">properties</span> as <span class="c30">$</span><span class="c29">key</span> <span class="c30">=</span><span class="c30">&gt;</span> <span class="c30">$</span><span class="c29">value</span><span class="c28">)</span> <span class="c28">{</span>
            <span class="c30">if</span> <span class="c28">(</span>property_exists<span class="c28">(</span><span class="c30">$</span><span class="c29">this</span>, <span class="c30">$</span><span class="c29">key</span><span class="c28">))</span> <span class="c28">{</span>
                <span class="c30">$</span><span class="c29">this</span><span class="c30">-</span><span class="c30">&gt;</span><span class="c30">$</span><span class="c29">key</span> <span class="c30">=</span> <span class="c30">$</span><span class="c29">value</span>;
            <span class="c28">}</span>
        <span class="c28">}</span>
        <span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>save<span class="c28">()</span>;
    <span class="c28">}</span>

    <span class="c26">/**</span>
<span class="c26">     * Update a single property</span>
<span class="c26">     *</span>
<span class="c26">     * @param string $key   Property name</span>
<span class="c26">     * @param mixed  $value Property value</span>
<span class="c26">     * </span>
<span class="c26">     * @return void</span>
<span class="c26">     */</span>
    public <span class="c31">function</span> updateProperty<span class="c28">(</span><span class="c30">$</span><span class="c29">key</span>, <span class="c30">$</span><span class="c29">value</span><span class="c28">)</span>
    <span class="c28">{</span>
        <span class="c30">if</span> <span class="c28">(</span>property_exists<span class="c28">(</span><span class="c30">$</span><span class="c29">this</span>, <span class="c30">$</span><span class="c29">key</span><span class="c28">))</span> <span class="c28">{</span>
            <span class="c30">$</span><span class="c29">this</span><span class="c30">-</span><span class="c30">&gt;</span><span class="c30">$</span><span class="c29">key</span> <span class="c30">=</span> <span class="c30">$</span><span class="c29">value</span>;
        <span class="c28">}</span>
        <span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>save<span class="c28">()</span>;
    <span class="c28">}</span>

    <span class="c26">/**</span>
<span class="c26">     * Delete an object</span>
<span class="c26">     *</span>
<span class="c26">     * @return void</span>
<span class="c26">     */</span>
    public <span class="c31">function</span> <span class="c29">delete</span><span class="c28">()</span>
    <span class="c28">{</span>
        <span class="c32">global</span> <span class="c30">$</span><span class="c29">db</span>;

        <span class="c30">$</span><span class="c29">delete</span>    <span class="c30">=</span> &quot;<span class="c27">DELETE FROM </span>&quot; <span class="c30">.</span> <span class="c29">strtolower</span><span class="c28">(</span>get_called_class<span class="c28">())</span> <span class="c30">.</span> &quot;<span class="c27"> WHERE `id` = :id</span>&quot;;
        <span class="c30">$</span><span class="c29">statement</span> <span class="c30">=</span> <span class="c30">$</span><span class="c29">db</span><span class="c32">-&gt;</span>prepare<span class="c28">(</span><span class="c30">$</span><span class="c29">statement</span><span class="c28">)</span>;
        <span class="c30">$</span><span class="c29">statement</span><span class="c32">-&gt;</span>bindParam<span class="c28">(</span>'<span class="c27">:id</span>', <span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>id, PDO<span class="c30">::</span>PARAM_INT<span class="c28">)</span>;

        <span class="c30">$</span><span class="c29">statement</span><span class="c32">-&gt;</span>execute<span class="c28">()</span>;
    <span class="c28">}</span>
<span class="c28">}</span>
<span class="c28">?&gt;</span>
</pre>
<p class="vci_info">HTML code generated by <a href="http://www.zacharyfox.com/blog/free-tools/vim-color-improved">vim-color-improved v.0.4.0.</a><strong>Download this code:</strong> <a href="http://www.zacharyfox.com/code/php/classes/base.php">base.php</a></p>
<p>Now, you&#8217;ll probably notice that this is an abstract class, meaning that we can&#8217;t create any Base objects, but must extend the class. Here is an example of a child class that holds name / value pairs:</p>
<pre class="vci_code">
<span class="c28">&lt;?php</span>
<span class="c26">/**</span>
<span class="c26"> * Extends the base class</span>
<span class="c26"> *</span>
<span class="c26"> */</span>
<span class="c32">class</span> Extend_Base <span class="c32">extends</span> Base
<span class="c28">{</span>
    protected <span class="c30">$</span><span class="c29">id</span>;
    protected <span class="c30">$</span><span class="c29">name</span>;
    protected <span class="c30">$</span><span class="c29">value</span>;
<span class="c28">}</span>
<span class="c28">?&gt;</span>
</pre>
<p class="vci_info">HTML code generated by <a href="http://www.zacharyfox.com/blog/free-tools/vim-color-improved">vim-color-improved v.0.4.0.</a><strong>Download this code:</strong> <a href="http://www.zacharyfox.com/code/php/classes/extend_base.php">extend_base.php</a></p>
<p>Once I&#8217;ve created the matching db table, I&#8217;m ready to get some CRUD done.</p>
<h3>Creating an object</h3>
<p>To create an object, I simply pass the parameters as an associative array of properties and their values.</p>
<pre class="vci_code">
<span class="c28">&lt;?php</span>
<span class="c30">$</span><span class="c29">properties</span> <span class="c30">=</span> <span class="c32">array</span><span class="c28">(</span>
    '<span class="c27">name</span>'  <span class="c30">=</span><span class="c30">&gt;</span> '<span class="c27">First Object</span>',
    '<span class="c27">value</span>' <span class="c30">=</span><span class="c30">&gt;</span> '<span class="c27">This is the first object</span>'
<span class="c28">)</span>;

<span class="c30">$</span><span class="c29">extend_base</span> <span class="c30">=</span> Extend_Base<span class="c30">::</span>create<span class="c28">(</span><span class="c30">$</span><span class="c29">properties</span><span class="c28">)</span>;
<span class="c28">?&gt;</span>
</pre>
<p class="vci_info">HTML code generated by <a href="http://www.zacharyfox.com/blog/free-tools/vim-color-improved">vim-color-improved v.0.4.0.</a><strong>Download this code:</strong> <a href="http://www.zacharyfox.com/code/php/examples/create_extend_base_object.php">create_extend_base_object.php</a></p>
<h3>Getting objects</h3>
<p>Getting is simple. Either get by ID or get an array of all the objects. It would be fairly trivial to add a find method.</p>
<pre class="vci_code">
<span class="c28">&lt;?php</span>
<span class="c26">// Single object</span>
<span class="c30">$</span><span class="c29">extend_object</span> <span class="c30">=</span> Extend_Base<span class="c30">::</span>get<span class="c28">(</span><span class="c27">1</span><span class="c28">)</span>;

<span class="c26">// All objects</span>
<span class="c30">$</span><span class="c29">extend_objects</span> <span class="c30">=</span> Extend_Base<span class="c30">::</span>getAll<span class="c28">()</span>;
<span class="c28">?&gt;</span>
</pre>
<p class="vci_info">HTML code generated by <a href="http://www.zacharyfox.com/blog/free-tools/vim-color-improved">vim-color-improved v.0.4.0.</a><strong>Download this code:</strong> <a href="http://www.zacharyfox.com/code/php/examples/get_extend_base_object.php">get_extend_base_object.php</a></p>
<h3>Updating</h3>
<p>You can update multiple parameters at once by passing an associative array as you did in the create method, or update a single parameter by using the updateProperty method and passing the name and value.</p>
<pre class="vci_code">
<span class="c28">&lt;?php</span>
<span class="c30">$</span><span class="c29">extend_base</span> <span class="c30">=</span> Extend_Base<span class="c30">::</span>get<span class="c28">(</span><span class="c27">1</span><span class="c28">)</span>;

<span class="c30">$</span><span class="c29">properties</span> <span class="c30">=</span> <span class="c32">array</span><span class="c28">(</span>
    '<span class="c27">name</span>'  <span class="c30">=</span><span class="c30">&gt;</span> '<span class="c27">Updated Name</span>',
    '<span class="c27">value</span>' <span class="c30">=</span><span class="c30">&gt;</span> '<span class="c27">Updated value</span>'
<span class="c28">)</span>;

<span class="c30">$</span><span class="c29">extend_base</span><span class="c32">-&gt;</span>update<span class="c28">(</span><span class="c30">$</span><span class="c29">properties</span><span class="c28">)</span>;

<span class="c30">$</span><span class="c29">extend_base</span><span class="c32">-&gt;</span>updateProperty<span class="c28">(</span>'<span class="c27">value</span>', '<span class="c27">Updated value again</span>'<span class="c28">)</span>;
<span class="c28">?&gt;</span>
</pre>
<p class="vci_info">HTML code generated by <a href="http://www.zacharyfox.com/blog/free-tools/vim-color-improved">vim-color-improved v.0.4.0.</a><strong>Download this code:</strong> <a href="http://www.zacharyfox.com/code/php/examples/update_extend_base_object.php">update_extend_base_object.php</a></p>
<h3>Deleting</h3>
<pre class="vci_code">
<span class="c28">&lt;?php</span>
<span class="c30">$</span><span class="c29">extend_base</span> <span class="c30">=</span> Extend_Base<span class="c30">::</span>get<span class="c28">(</span><span class="c27">1</span><span class="c28">)</span>;
<span class="c30">$</span><span class="c29">extend_base</span><span class="c32">-&gt;</span>delete<span class="c28">()</span>;
<span class="c28">?&gt;</span>
</pre>
<p class="vci_info">HTML code generated by <a href="http://www.zacharyfox.com/blog/free-tools/vim-color-improved">vim-color-improved v.0.4.0.</a><strong>Download this code:</strong> <a href="http://www.zacharyfox.com/code/php/examples/delete_extend_base_object.php">delete_extend_base_object.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zacharyfox.com/blog/php/simple-model-crud-with-php-5-3/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP Mail Class</title>
		<link>http://www.zacharyfox.com/blog/php/simple-mail-class</link>
		<comments>http://www.zacharyfox.com/blog/php/simple-mail-class#comments</comments>
		<pubDate>Sun, 03 Feb 2008 15:56:36 +0000</pubDate>
		<dc:creator>Zachary Fox</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.zacharyfox.com/blog/php/simple-mail-class</guid>
		<description><![CDATA[This is a very simple mailer class that is also easy to use.

&#60;?php
/**
 * mail.php
 *
 * A (very) simple mailer class written in PHP.
 *
 * @author Zachary Fox
 * @version 1.0
 */

class ZFmail{
    var $to = null;
    var $from = null;
    var $subject = [...]]]></description>
			<content:encoded><![CDATA[<p>This is a very simple mailer class that is also easy to use.</p>
<pre class="vci_code">
<span class="c28">&lt;?php</span>
<span class="c26">/**</span>
<span class="c26"> * mail.php</span>
<span class="c26"> *</span>
<span class="c26"> * A (very) simple mailer class written in PHP.</span>
<span class="c26"> *</span>
<span class="c26"> * @author Zachary Fox</span>
<span class="c26"> * @version 1.0</span>
<span class="c26"> */</span>

<span class="c32">class</span> ZFmail<span class="c28">{</span>
    <span class="c30">var</span> <span class="c30">$</span><span class="c29">to</span> <span class="c30">=</span> <span class="c32">null</span>;
    <span class="c30">var</span> <span class="c30">$</span><span class="c29">from</span> <span class="c30">=</span> <span class="c32">null</span>;
    <span class="c30">var</span> <span class="c30">$</span><span class="c29">subject</span> <span class="c30">=</span> <span class="c32">null</span>;
    <span class="c30">var</span> <span class="c30">$</span><span class="c29">body</span> <span class="c30">=</span> <span class="c32">null</span>;
    <span class="c30">var</span> <span class="c30">$</span><span class="c29">headers</span> <span class="c30">=</span> <span class="c32">null</span>;

     <span class="c31">function</span> ZFmail<span class="c28">(</span><span class="c30">$</span><span class="c29">to</span>,<span class="c30">$</span><span class="c29">from</span>,<span class="c30">$</span><span class="c29">subject</span>,<span class="c30">$</span><span class="c29">body</span><span class="c28">){</span>
        <span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>to      <span class="c30">=</span> <span class="c30">$</span><span class="c29">to</span>;
        <span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>from    <span class="c30">=</span> <span class="c30">$</span><span class="c29">from</span>;
        <span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>subject <span class="c30">=</span> <span class="c30">$</span><span class="c29">subject</span>;
        <span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>body    <span class="c30">=</span> <span class="c30">$</span><span class="c29">body</span>;
    <span class="c28">}</span>

    <span class="c31">function</span> send<span class="c28">(){</span>
      <span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>addHeader<span class="c28">(</span>'<span class="c27">From: </span>'<span class="c30">.</span><span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>from<span class="c30">.</span>&quot;<span class="c28">\r\n</span>&quot;<span class="c28">)</span>;
        <span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>addHeader<span class="c28">(</span>'<span class="c27">Reply-To: </span>'<span class="c30">.</span><span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>from<span class="c30">.</span>&quot;<span class="c28">\r\n</span>&quot;<span class="c28">)</span>;
        <span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>addHeader<span class="c28">(</span>'<span class="c27">Return-Path: </span>'<span class="c30">.</span><span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>from<span class="c30">.</span>&quot;<span class="c28">\r\n</span>&quot;<span class="c28">)</span>;
        <span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>addHeader<span class="c28">(</span>'<span class="c27">X-mailer: ZFmail 1.0</span>'<span class="c30">.</span>&quot;<span class="c28">\r\n</span>&quot;<span class="c28">)</span>;
        <span class="c29">mail</span><span class="c28">(</span><span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>to,<span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>subject,<span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>body,<span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>headers<span class="c28">)</span>;
    <span class="c28">}</span>

    <span class="c31">function</span> addHeader<span class="c28">(</span><span class="c30">$</span><span class="c29">header</span><span class="c28">){</span>
        <span class="c30">$</span><span class="c29">this</span><span class="c32">-&gt;</span>headers <span class="c30">.=</span> <span class="c30">$</span><span class="c29">header</span>;
    <span class="c28">}</span>

<span class="c28">}</span>
<span class="c28">?&gt;</span>
</pre>
<p class="vci_info">HTML code generated by <a href="http://www.zacharyfox.com/blog/free-tools/vim-color-improved">vim-color-improved v.0.4.0.</a><strong>Download this code:</strong> <a href="http://www.zacharyfox.com/code/php/classes/mail.php">mail.php</a></p>
<p><strong>Usage</strong></p>
<p>Using the mail class is easy. Simply create a new ZFmail object, passing the parameters <em>$to</em>,<em>$from</em>,<em>$subject</em>, and <em>$body</em>, then call the method send on the object that you created. It&#8217;s as easy as pie. The following example is for a simple form mail script.</p>
<p><strong>Example</strong></p>
<pre class="vci_code">
<span class="c28">&lt;?php</span>
<span class="c26">/**</span>
<span class="c26"> * example/mail.php</span>
<span class="c26"> *</span>
<span class="c26"> * An example script to accept a post and send an email using ZFmail.</span>
<span class="c26"> *</span>
<span class="c26"> * @author Zachary Fox</span>
<span class="c26"> */</span>

 <span class="c26">// Include the mail.php file that holds the class definition</span>
 <span class="c31">require_once</span><span class="c28">(</span>'<span class="c27">mail.php</span>'<span class="c28">)</span>;

 <span class="c26">// First we set the to address. I would not let anyone put in a to </span>
 <span class="c26">// address in a web form, and neither should you.</span>
 <span class="c30">$</span><span class="c29">to</span> <span class="c30">=</span> '<span class="c27">me@example.com</span>';

 <span class="c26">// Then we get the information we need from the $_POST array.</span>
 <span class="c26">// This step is not necessary, but in a production environment, </span>
 <span class="c26">// we would process and sanitize this data here, rather than </span>
 <span class="c26">// passing raw post data to the class.</span>
 <span class="c30">$</span><span class="c29">from</span> <span class="c30">=</span> <span class="c30">$</span><span class="c29">_POST</span><span class="c28">[</span>'<span class="c27">from</span>'<span class="c28">]</span>;
 <span class="c30">$</span><span class="c29">subject</span> <span class="c30">=</span> <span class="c30">$</span><span class="c29">_POST</span><span class="c28">[</span>'<span class="c27">subject</span>'<span class="c28">]</span>;
 <span class="c30">$</span><span class="c29">body</span> <span class="c30">=</span> <span class="c30">$</span><span class="c29">_POST</span><span class="c28">[</span>'<span class="c27">body</span>'<span class="c28">]</span>;

 <span class="c26">// Then create the ZFmail object using the information from above</span>
 <span class="c30">$</span><span class="c29">mail</span> <span class="c30">=</span> <span class="c31">new</span> ZFmail<span class="c28">(</span><span class="c30">$</span><span class="c29">to</span>,<span class="c30">$</span><span class="c29">from</span>,<span class="c30">$</span><span class="c29">subject</span>,<span class="c30">$</span><span class="c29">body</span><span class="c28">)</span>;

 <span class="c26">// Finally, call the object's send method to deliver the mail.</span>
 <span class="c30">$</span><span class="c29">mail</span><span class="c32">-&gt;</span>send<span class="c28">()</span>;
<span class="c28">?&gt;</span>
</pre>
<p class="vci_info">HTML code generated by <a href="http://www.zacharyfox.com/blog/free-tools/vim-color-improved">vim-color-improved v.0.4.0.</a><strong>Download this code:</strong> <a href="http://www.zacharyfox.com/code/php/examples/mail.php">mail.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.zacharyfox.com/blog/php/simple-mail-class/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
