Se você precisa de uma classe PHP para cálculo de máscara de sub-rede IPv4, talvez este artigo irá ajudá-lo a concluir seu projeto. A classe precisa receber um endereço IP com o prefixo CIDR (ex. 192.168.0.1/24) para retornar o restante dos valores de configuração da rede para você.

Os valores retornados serão: Endereço/Prefixo CIDR, Endereço IP, Prefixo CIDR, Máscara de sub-rede, IP da Rede, Broadcast da Rede, Primeiro Host, Último Host, número total de IPs e o número total de hosts.

Por exemplo: Para o IP 172.16.5.10/30, os valores retornados estão abaixo.

Endereço/Rede: 172.16.5.10/30
Endereço: 172.16.5.10
Prefixo CIDR: /30
Máscara de sub-rede: 255.255.255.252
IP da Rede: 172.16.5.8/30
Broadcast da Rede: 172.16.5.11
Primeiro Host: 172.16.5.9
Último Host: 172.16.5.10
Total de IPs:  4
Hosts: 2

Você pode fazer um teste da classe no link abaixo:

Agora vamos aos códigos.

A classe

<?php
/**
 * calc_ipv4 - Cálculo de máscara de sub-rede IPv4
 */
class calc_ipv4
{
    // O endereço IP
    public $endereco;
    
    // O cidr
    public $cidr;
    
    // O endereço IP 
    public $endereco_completo;

    /**
     * O construtor apenas configura as propriedades da classe
     */
    public function __construct( $endereco_completo ) {
        $this->endereco_completo = $endereco_completo;
        $this->valida_endereco();
    }
    
    /**
     * Valida o endereço IPv4
     */
    public function valida_endereco() {
        // Expressão regular
        $regexp = '/^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/[0-9]{1,2}$/';
        
        // Verifica o IP/CIDR
        if ( ! preg_match( $regexp, $this->endereco_completo ) ) {
            return false;
        }
        
        // Separa o IP do prefixo CIDR
        $endereco = explode( '/', $this->endereco_completo );
        
        // CIDR
        $this->cidr = (int) $endereco[1];
        
        // Endereço IPv4
        $this->endereco = $endereco[0];
        
        // Verifica o prefixo
        if ( $this->cidr > 32 ) {
            return false;
        }
        
        // Faz um loop e verifica cada número do IP
        foreach( explode( '.', $this->endereco ) as $numero ) {
        
            // Garante que é um número
            $numero = (int) $numero;
            
            // Não pode ser maior que 255 nem menor que 0
            if ( $numero > 255 || $numero < 0 ) {
                return false;
            }
        }
        
        // IP "válido" (correto)
        return true;
    }

    /* Retorna o endereço IPv4/CIDR */
    public function endereco_completo() { 
        return ( $this->endereco_completo ); 
    }

    /* Retorna o endereço IPv4 */
    public function endereco() { 
        return ( $this->endereco ); 
    }

    /* Retorna o prefixo CIDR */
    public function cidr() { 
        return ( $this->cidr ); 
    }

    /* Retorna a máscara de sub-rede */
    public function mascara() {
        if ( $this->cidr() == 0 ) {
            return '0.0.0.0';
        }

        return ( 
            long2ip(
                ip2long("255.255.255.255") << ( 32 - $this->cidr ) 
            )
        );
    }

    /* Retorna a rede na qual o IP está */
    public function rede() {
        if ( $this->cidr() == 0 ) {
            return '0.0.0.0';
        }

        return (
            long2ip( 
                ( ip2long( $this->endereco ) ) & ( ip2long( $this->mascara() ) )
            )
        );
    }

    /* Retorna o IP de broadcast da rede */
    public function broadcast() {
        if ( $this->cidr() == 0 ) {
            return '255.255.255.255';
        }
        
        return (
            long2ip( ip2long($this->rede() ) | ( ~ ( ip2long( $this->mascara() ) ) ) )
        );
    }
    
    /* Retorna o número total de IPs (com a rede e o broadcast) */
    public function total_ips() {
        return( pow(2, ( 32 - $this->cidr() ) ) );
    }
    
    /* Retorna os número de IPs que podem ser utilizados na rede */
    public function ips_rede() {
        if ( $this->cidr() == 32 ) {
            return 0;
        } elseif ( $this->cidr() == 31 ) {
            return 0;
        }
        
        return( abs( $this->total_ips() - 2 ) );
    }
    
    /* Retorna os número de IPs que podem ser utilizados na rede */
    public function primeiro_ip() {
        if ( $this->cidr() == 32 ) {
            return null;
        } elseif ( $this->cidr() == 31 ) {
            return null;
        } elseif ( $this->cidr() == 0 ) {
            return '0.0.0.1';
        }
        
        return (
            long2ip( ip2long( $this->rede() ) | 1 )
        );
    }
    
    /* Retorna os número de IPs que podem ser utilizados na rede */
    public function ultimo_ip() {
        if ( $this->cidr() == 32 ) {
            return null;
        } elseif ( $this->cidr() == 31 ) {
            return null;
        }
    
        return (
            long2ip( ip2long( $this->rede() ) | ( ( ~ ( ip2long( $this->mascara() ) ) ) - 1 ) )
        );
    }
}

Todos os métodos são públicos, ou seja, você pode utilizar qualquer um deles individualmente.

Utilização da classe

Para utilizar a classe, é recomendado que você utilize primeiro o método de validação do IP, veja um exemplo:

<?php 
// Inclui a classe
include 'classes/class_calc_ipv4.php';

// Cria o objeto da classe já recebendo o IP/CIDR
$ip = new calc_ipv4('192.168.0.5/29');

// Checa se o IP é válido
if( $ip->valida_endereco() ) {
    // Utiliza os métodos disponíveis
    echo "<b>Endereço/Rede: </b>" . $ip->endereco_completo() . '<br>';
    echo "<b>Endereço: </b>" . $ip->endereco() . '<br>';
    echo "<b>Prefixo CIDR: </b>/" . $ip->cidr() . '<br>';
    echo "<b>Máscara de sub-rede: </b>" . $ip->mascara() . '<br>';
    echo "<b>IP da Rede: </b>" . $ip->rede() . '/' . $ip->cidr() . '<br>';
    echo "<b>Broadcast da Rede: </b>" . $ip->broadcast() . '<br>';
    echo "<b>Primeiro Host: </b>" . $ip->primeiro_ip() . '<br>';
    echo "<b>Último Host: </b>" . $ip->ultimo_ip() . '<br>';
    echo "<b>Total de IPs:  </b>" . $ip->total_ips() . '<br>';
    echo "<b>Hosts: </b>" . $ip->ips_rede();
    echo "</pre>";
} else {
    echo 'Endereço IPv4 inválido!';
}
?>

Simples assim!

Download

Você pode baixar o exemplo criado nesse artigo no link abaixo:

Qualquer dúvida é só perguntar aí nos comentários.